在特定节点/元素后插入XML元素

6

我想在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);

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

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

2个回答

6
<thesaurus> 元素有一个 xmlns 属性,指定了一个命名空间,因此您需要在所有元素名称中添加该命名空间。另外,如果要使新的 <expansion> 元素出现在 <thesaurus> 中而不是其后,请使用 Add 而不是 AddAfterSelf
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. 

0

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

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

此外,请记住,您当前的代码将在thesaurus元素之后添加新的expansion元素,而不是作为其子元素。如果您想在最后一个thesaurus元素下添加新的expansion元素,则应改用以下代码:
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>

谢谢你的回复。我删除了root.Elements(ns +“thesaurus”);并调试了代码。现在搞定了。Michael Liu发布了正确的代码以添加词库XML文件元素。 - mkacar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接