使用LINQ To XML自定义XML元素

本文关键字:XML 自定义 元素 To LINQ 使用 | 更新日期: 2023-09-27 18:18:52

我有以下代码:

  XNamespace testNM = "urn:lst-emp:emp";
                XDocument xDoc;
                string path = "project_data.xml";
                if (!File.Exists(path))
                {
                    xDoc = new XDocument(
                               new XDeclaration("1.0", "UTF-16", null),
                               new XElement(testNM + "Test")
                               );
                }
                else
                {
                    xDoc = XDocument.Load(path);
                }
                var element = new XElement("key",
                                        new XElement("Type", type),
                                        new XElement("Value", value));
                xDoc.Element(testNM + "Test").Add(element);
                // Save to Disk
                xDoc.Save(path);

在XML文件中产生如下输出:

<?xml version="1.0" encoding="utf-16"?>
<Test xmlns="urn:lst-emp:emp">
  <key xmlns="">
    <Type>String</Type>
    <Value>somestring</Value>
  </key>
</Test>

如何在XML文件中得到这样的输出?

<?xml version="1.0" encoding="utf-16"?>
<Tests xmlns="urn:lst-emp:emp">
  <key name="someString">
    <Type>String</Type>
    <Value>somestring</Value>
  </key >
</Tests>

使用LINQ To XML自定义XML元素

你可以这样做:

var element = new XElement("key",
                           new XAttribute("name", "someString"),
                           new XElement("Type", "type"),
                           new XElement("Value", "value"));

要提供Bilyukov答案的完整版本,这应该产生预期的输出。显然,用您希望填充的变量替换"someString"静态字符串。更改包括使用XName.Get(string, string)XElement构造器创建适当的XName对象。

 XNamespace testNM = "urn:lst-emp:emp";
            XDocument xDoc;
            string path = "project_data.xml";
            if (!File.Exists(path))
            {
                xDoc = new XDocument(
                           new XDeclaration("1.0", "UTF-16", null),
                           new XElement(XName.Get("Tests", testNM.NamespaceName))
                           );
            }
            else
            {
                xDoc = XDocument.Load(path);
            }
            var element = new XElement(XName.Get("key", testNM.NamespaceName),
                                    new XAttribute("name", "someString"),
                                    new XElement("Type", type),
                                    new XElement("Value", value));
            xDoc.Element(XName.Get("Tests", testNM.NamespaceName)).Add(element);
            // Save to Disk
            xDoc.Save(path);

您的XML具有默认名称空间。声明默认名称空间的元素的后代被认为在相同的默认名称空间中,除非它显式地使用不同的名称空间声明。这就是为什么您需要为<key>元素使用相同的XNamespace。:

var element = new XElement(testNM +"key",
                           new XAttribute("name", "someString"),
                           new XElement(testNM +"Type", type),
                           new XElement(testNM +"Value", value));