我想在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文件中?
你能帮我解决这个问题吗?感谢。
答案 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>