在最后一个特定节点/元素之后插入XML元素

时间:2012-01-22 19:28:22

标签: xml linq-to-xml

我想在XML中的最后一个子元素之后添加元素。但是我收到了一个错误。

<XML ID="Microsoft Search Thesaurus">
  <thesaurus xmlns="x-schema:tsSchema.xml">
    <diacritics_sensitive>0</diacritics_sensitive>
    <expansion>
        <sub>Internet Explorer</sub>
        <sub>IE</sub>
        <sub>IE5</sub>
    </expansion>
    <replacement>
        <pat>NT5</pat>
        <pat>W2K</pat>
        <sub>Windows 2000</sub>
    </replacement>
    <expansion>
        <sub>run</sub>
        <sub>jog</sub>
    </expansion>
    <expansion>
      <sub>home</sub>
      <sub>house</sub>
    </expansion>
  </thesaurus>
</XML>

我的代码如下,我在调试代码时遇到了这个错误。

  

InvalidOperationException未处理。

     
    

序列不包含任何元素。

  
XDocument doc = XDocument.Load("tseng.xml");  //load the xml file.
IEnumerable<XElement> MemberList = doc.Element("XML").Elements("thesaurus");
var Member = new XElement("expansion",
                 new XElement("sub", "home"),
                 new XElement("sub", "house")
             );
MemberList.Last().AddAfterSelf(Member);  //add node to the last element.
doc.Save("tseng.xml");

此错误适用于特定行:

MemberList.Last().AddAfterSelf(Member);

我不知道这个代码的问题是什么。如何在最后<expansion>节点之后将元素添加到我的XML文件中?

你能帮我解决这个问题吗?感谢。

2 个答案:

答案 0 :(得分:6)

<thesaurus>元素具有指定命名空间的xmlns属性,因此您需要将命名空间添加到所有元素名称。另外,如果您希望新的Add元素显示在AddAfterSelf内而不是在<expansion>之后,则应使用<thesaurus>代替XNamespace ns = "x-schema:tsSchema.xml"; IEnumerable<XElement> MemberList = doc.Element("XML").Elements(ns + "thesaurus"); var Member = new XElement(ns + "expansion", new XElement(ns + "sub", "home"), new XElement(ns + "sub", "house")); MemberList.Last().Add(Member); //add node to the last element.

{{1}}

答案 1 :(得分:0)

您需要为thesaurus元素明确指定名称空间,因为它与根XML节点的名称不同:

XNamespace ns = "x-schema:tsSchema.xml";
XDocument doc = XDocument.Load("tseng.xml");
IEnumerable<XElement> MemberList = doc.Element("XML").Elements(ns + "thesaurus");

另外,请注意,您当前的代码会在 expansion之后添加新的thesaurus元素,而不是其子代。如果您想在最后expansion元素下添加新的thesaurus元素,则应使用此代码:

var MemberList = root.Elements(ns + "thesaurus");
var Member = new XElement(ns + "expansion",
    new XElement(ns + "sub", "home"),
    new XElement(ns + "sub", "house")
);
MemberList.Last().Add(Member);

这将产生类似于以下示例的XML:

<XML ID="Microsoft Search Thesaurus">
  <thesaurus xmlns="x-schema:tsSchema.xml">
    <diacritics_sensitive>0</diacritics_sensitive>
    <!-- elided: new element goes here -->
    <expansion>
      <sub>home</sub>
      <sub>house</sub>
    </expansion>
  </thesaurus>
</XML>