如何在XML C#中的另一个标签中生成标签?

发布于 2025-01-28 04:50:23 字数 1826 浏览 1 评论 0 原文

我有一个类似于下面的类文件:

public class property : root
{
   public string languages { get; set; } 
}

我正在尝试生成 xml 如下:

最终输出:

<root>
    <property>
    --other properties
        <languages>
            <en>This is English Languages description</en>
            <fr></fr>
        </languages>
    </property>
</root>

这就是我尝试生成&lt; lanking&gt; gt;在

private string GenerateLanguageTag(IList<Languages> languages)
{
    string lang = string.Empty;
    foreach (var item in languages)
    {
        lang += "<" + item.IsoLanguageCode + ">" + item.Description + "</" + item.IsoLanguageCode + ">";
    }
    return lang;
}

<root>
    <property>
       --other properties
         <languages>&lt;en&gt;This is English Languages description 
 &lt;/en&gt;&lt;fr&gt;&lt;/fr&gt;</languages>
    </property>
</root>

root root = GetData(data);
XmlSerializer xmlSerializer = new XmlSerializer(typeof(root));
using (StringWriter xmlWriter = new StringWriter())
{
    xmlSerializer.Serialize(xmlWriter, root);
    value = xmlWriter.ToString();
    value = value.Replace(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"", "");
    value = value.Replace(" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"", "");
    value = value.Replace("utf-16", "ISO-8859-1");            
    if (File.Exists(filePath))
    {
        var document = XDocument.Parse(value);
        document.Save(filePath);              
    }
}

&lt;语言中的其他语言&gt;&lt;/语言&gt; 是根据我们在数据库中的语言动态生成的。

I have a class file like below :

public class property : root
{
   public string languages { get; set; } 
}

I am trying to generate xml like below :

Final Output:

<root>
    <property>
    --other properties
        <languages>
            <en>This is English Languages description</en>
            <fr></fr>
        </languages>
    </property>
</root>

This is how I am trying to generate the <languages> tag :

private string GenerateLanguageTag(IList<Languages> languages)
{
    string lang = string.Empty;
    foreach (var item in languages)
    {
        lang += "<" + item.IsoLanguageCode + ">" + item.Description + "</" + item.IsoLanguageCode + ">";
    }
    return lang;
}

output:

<root>
    <property>
       --other properties
         <languages><en>This is English Languages description 
 </en><fr></fr></languages>
    </property>
</root>

Code:

root root = GetData(data);
XmlSerializer xmlSerializer = new XmlSerializer(typeof(root));
using (StringWriter xmlWriter = new StringWriter())
{
    xmlSerializer.Serialize(xmlWriter, root);
    value = xmlWriter.ToString();
    value = value.Replace(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"", "");
    value = value.Replace(" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"", "");
    value = value.Replace("utf-16", "ISO-8859-1");            
    if (File.Exists(filePath))
    {
        var document = XDocument.Parse(value);
        document.Save(filePath);              
    }
}

Update:

Tags "en", "fr" and many other languages inside <languages></languages> are generated dynamically based on the languages we have in the database.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

囍笑 2025-02-04 04:50:23

而不是将语言声明为字符串,将其声明为 XELEMENT ,并用语言的孩子属性应插入其父母&lt; property&gt; 元素。因此,您的数据模型应该看起来像:

public class root
{
    public property property { get; set; }
}

public class property
{
    [XmlAnyElement("languages")]
    public XElement languages { get; set; }
}

您将构造模型如下:

// Your dynamic list of languages & values
var languages = new List<(string IsoLanguageCode, string Description)>
{
    ("en", "This is English Languages description"),
    ("fr", ""),
};

var root = new root()
{
    property = new()
    {
        languages = new XElement("languages", languages.Select(l => new XElement(l.IsoLanguageCode, l.Description))),
    },
};

        

注:

  • xmlanyelementAttribute 应将其应用于类型代码> XMLNODE (或同一数组),但实际上它也适用于类型 XElement 的属性。由于linq to-xml比旧的 xmldocument api更容易使用,因此我建议使用它。

  • 在您的问题中,您显示属性作为 root 的子类。为了获得所需的嵌套,它应该是由 root 包含的单独类,而不是 root> root 的子类。

  • 消除 XSI XSD namespaces(无需进行字符串替换)请参见 XMLSerializer:删除不必要的XSI和XSD名称空间 。。

演示小提琴在这里

Rather than declaring languages as a string, declare it as an XElement and mark it with [XmlAnyElement("languages")]. This informs the serializer that the children of the languages property should be inserted as children of their parent <property> element. Thus your data model should look like:

public class root
{
    public property property { get; set; }
}

public class property
{
    [XmlAnyElement("languages")]
    public XElement languages { get; set; }
}

And you would construct your model as follows:

// Your dynamic list of languages & values
var languages = new List<(string IsoLanguageCode, string Description)>
{
    ("en", "This is English Languages description"),
    ("fr", ""),
};

var root = new root()
{
    property = new()
    {
        languages = new XElement("languages", languages.Select(l => new XElement(l.IsoLanguageCode, l.Description))),
    },
};

        

Notes:

  • The documentation for XmlAnyElementAttribute indicates it should be applied to properties of type XmlElement or XmlNode (or arrays of the same), but in fact it works for properties of type XElement as well. Since LINQ-to-XML is easier to work with than the old XmlDocument API, I suggest using it instead.

  • In your question you show property as a subclass of root. In order to get the nesting you require, it should be a separate class contained by root, not a subclass of root.

  • To eliminate the xsi and xsd namespaces (without needing to do a string replacement) see XmlSerializer: remove unnecessary xsi and xsd namespaces.

Demo fiddle here.

嘿看小鸭子会跑 2025-02-04 04:50:23

使用XML Linq:

           string header = "<root></root>";
            XDocument doc = XDocument.Parse(header);

            XElement root = doc.Root;

            root.Add( new XElement("property", new object[] {
                new XElement("languages", new object[] {
                    new XElement("en", "This is English Languages description"),
                    new XElement("fr")
                })
            }));

        }

Using Xml Linq :

           string header = "<root></root>";
            XDocument doc = XDocument.Parse(header);

            XElement root = doc.Root;

            root.Add( new XElement("property", new object[] {
                new XElement("languages", new object[] {
                    new XElement("en", "This is English Languages description"),
                    new XElement("fr")
                })
            }));

        }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文