使用LINQ To XML自定义XML元素

时间:2014-08-21 08:08:08

标签: c# xml linq

我有以下代码:

  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>

请注意它只是XML文件中已更改的第3行。

3 个答案:

答案 0 :(得分:3)

你可以这样做:

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

答案 1 :(得分:2)

为了提供Bilyukov答案的完整版本,这应该产生预期的输出。显然可以替换&#34; someString&#34;根据需要填充变量的静态字符串。更改包括使用XName.Get(string, string)XName构造函数创建相应的XElement对象。

 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);

答案 2 :(得分:1)

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

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