C#Linq XDoc - 添加具有相同名称的元素

时间:2016-10-28 02:16:29

标签: c# xml linq element

我尝试使用c#Linq XDocument编写一个小型XML文件。

最终的xml文件应如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Asset InternalID="SOMEID" LastSaveDate="2016-10-28" LastSaveTime="01:01:33:00" AssetType="New">
    <type_metadata>
      <FIELD name="filename">SOMEID.MOV</FIELD>
      <FIELD name="duration">00:00:00:10</FIELD>
    </type_metadata>
  </Asset>
</Root>

这是我的代码:

XDocument doc = new XDocument(new XDeclaration("1.0", "UTF-8", null));
doc.Add(new XElement("Root"));
doc.Element("Root").Add(new XElement("Asset"));
doc.Element("Root").Element("Asset").Add(new XAttribute("InternalID", a.InternalID));
doc.Element("Root").Element("Asset").Add(new XAttribute("LastSaveDate", a.lastSaveDate));
doc.Element("Root").Element("Asset").Add(new XAttribute("LastSaveTime", a.lastSaveTime));
doc.Element("Root").Element("Asset").Add(new XAttribute("AssetType", a.AssetType));
doc.Element("Root").Element("Asset").Add(new XElement("type_metadata"));

doc.Element("Root").Element("Asset").Element("type_metadata").Add(new XElement("FIELD"));
doc.Element("Root").Element("Asset").Element("type_metadata").Element("FIELD").Add(new XAttribute("name","filename"));
doc.Element("Root").Element("Asset").Element("type_metadata").Element("FIELD").Value = a.filename;

doc.Element("Root").Element("Asset").Element("type_metadata").Add(new XElement("FIELD"));
doc.Element("Root").Element("Asset").Element("type_metadata").Element("FIELD").Add(new XAttribute("name", "duration"));
doc.Element("Root").Element("Asset").Element("type_metadata").Element("FIELD").Value = a.duration;

一切正常,直到我尝试进入第二个&#34; FIELD&#34;元件。 这样做的正确方法是什么?我做了一些研究,但我找不到一个与我想要完成的事情直接相关的简单答案。

3 个答案:

答案 0 :(得分:1)

如果在将新FIELD元素添加到父元素之前准备它,会更容易:

var filename = new XElement("FIELD",
                    new XAttribute("name","filename"),
                    a.filename
               );
var duration = new XElement("FIELD",
                    new XAttribute("name","duration"),
                    a.duration
               );
doc.Element("Root").Element("Asset").Element("type_metadata").Add(field);
doc.Element("Root").Element("Asset").Element("type_metadata").Add(duration);

答案 1 :(得分:1)

那是因为当您尝试添加第二个元素时,您正在使用:

doc.Element("Root").Element("Asset").Element("type_metadata").Element("FIELD")

它将返回与名称匹配的第一个元素,这种情况是先前添加&#34; FIELD&#34;元素,已经有&#34; name&#34;属性。

我建议您在将元素附加到文档之前创建元素。这样您就不必一遍又一遍地搜索元素:

XDocument doc = new XDocument(new XDeclaration("1.0", "UTF-8", null));

var root = new XElement("Root");

var asset = new XElement("Asset");
asset.Add(new XAttribute("InternalID", a.InternalID));
asset.Add(new XAttribute("LastSaveDate", a.lastSaveDate));
asset.Add(new XAttribute("LastSaveTime", a.lastSaveTime));
asset.Add(new XAttribute("AssetType", a.AssetType));

var type_metadata = new XElement("type_metadata");

var field = new XElement("FIELD");
field.Add(new XAttribute("name","filename"));
field.Value = a.filename;

type_metadata.Add(field);

var field2 = new XElement("FIELD");
field2.Add(new XAttribute("name","duration"));
field2.Value = a.duration;

type_metadata.Add(field2);

asset.Add(type_metadata);

root.Add(asset);

doc.Add(root);

此外,您可以在一个语句中创建整个文档:

XDocument doc = new XDocument(
    new XDeclaration("1.0", "UTF-8", null),
    new XElement("Root",
        new XElement("Asset",
            new XAttribute("InternalID", a.InternalID),
            new XAttribute("LastSaveDate", a.lastSaveDate),
            new XAttribute("LastSaveTime", a.lastSaveTime),
            new XAttribute("AssetType", a.AssetType),
            new Element("type_metadata",
                new XElement("FIELD",
                    new XAttribute("name", "filename"),
                    a.filename),
                new XElement("FIELD",
                    new XAttribute("name", "duration"),
                    a.duration)))));

答案 2 :(得分:0)

这可以通过不同方式实现。我只是按照你的方法。由于您有多个FIELD元素,因此代码中需要稍作修改。以下代码将按预期工作。

XDocument doc = new XDocument(new XDeclaration("1.0", "UTF-8", null));
doc.Add(new XElement("Root"));
doc.Element("Root").Add(new XElement("Asset"));
doc.Element("Root").Element("Asset").Add(new XAttribute("InternalID", "intID"));
doc.Element("Root").Element("Asset").Add(new XAttribute("LastSaveDate", "28.10.2016"));
doc.Element("Root").Element("Asset").Add(new XAttribute("LastSaveTime", "1.48PM"));
doc.Element("Root").Element("Asset").Add(new XAttribute("AssetType", "Laptop"));
doc.Element("Root").Element("Asset").Add(new XElement("type_metadata"));

doc.Element("Root").Element("Asset").Element("type_metadata").Add(new XElement("FIELD"));
doc.Element("Root").Element("Asset").Element("type_metadata").Element("FIELD").Add(new XAttribute("name", "filename"));
doc.Element("Root").Element("Asset").Element("type_metadata").Element("FIELD").Value = "a.txr";

doc.Element("Root").Element("Asset").Element("type_metadata").Add(new XElement("FIELD"));
doc.Element("Root").Element("Asset").Element("type_metadata").Elements().Last().Add(new XAttribute("name", "duration"));
doc.Element("Root").Element("Asset").Element("type_metadata").Elements().Last().Value = "00:12:98";