2012-01-22 108 views
4

我想在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文件?

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

回答

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

感谢您的解决方案。 – mkacar

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> 
+0

谢谢你的回复。我删除了root.Elements(ns +“thesaurus”);并调试代码。完成了。 Michael Liu发布了正确的代码来为词库xml文件添加元素。 – mkacar

相关问题