我想将XML片段添加到XML文档的最后一个元素,我遇到了问题,即我得到的错误是:
“参考节点不是。的子节点 这个节点“。
所以我现有的XML文档如下所示:
<MAP>
<LAYER name ="My first Layer">
<DATASET name="foo dataset" />
<SYMBOLOGY>
<SYMBOL colour="red" />
</SYMBOLOGY>
</LAYER>
<LAYER name="My second Layer">
<DATASET name="bar dataset" />
<SYMBOLOGY>
<SYMBOL colour="blue" />
</SYMBOLOGY>
</LAYER>
</MAP>
我想在最后一个LAYER元素之后插入的XML片段是:
<LAYER name="My third Layer">
<DATASET name="whatever dataset" />
<SYMBOLOGY>
<SYMBOL colour="yellow" />
</SYMBOLOGY>
</LAYER>
我使用的代码是:
XmlDocumentFragment xmlDocFrag = xmlDocument.CreateDocumentFragment();
xmlDocFrag.InnerXml = inputXML; //which is basically the third layer example - see above.
XmlElement rootElement = xmlDocument.DocumentElement;
XmlNode lastLayerNode = rootElement.SelectSingleNode(@"//LAYER[last()]");
rootElement.InsertAfter(xmlDocFrag, lastLayerNode); //error raised here.
对于我在这里做错的任何想法都会非常感激。我的XPath查询似乎找不到它似乎选择了正确的最后一层,它只是因为某些奇怪的原因而不会插入它。
更新/解决方案 - 如何使用XPATH执行此操作
最后在XPath中找到了它 - 看下面的代码,我认为基本上没有首先选择正确的父节点,选择最后一个LAYER然后在这个节点上尝试和InsertAfter()是不正确的。最好选择上面的级别,即MAP然后是AppendChild()。见下文:
XmlDocumentFragment xmlDocFrag = xmlDocument.CreateDocumentFragment();
xmlDocFrag.InnerXml = inputXML;
XmlElement mapElement = (XmlElement)xmlDocument.SelectSingleNode(@"//MAP[last()]");
mapElement.AppendChild(xmlDocFrag);
感谢所有回复和帮助:)
答案 0 :(得分:5)
考虑到你需要使用它来使用Framework 2.0,这是另一个解决方案:
string xml = "<map><layer>1</layer><layer>2</layer></map>";
string addMe = "<layer>3</layer>";
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xml);
XmlDocumentFragment xmlDocFrag = xmlDocument.CreateDocumentFragment();
xmlDocFrag.InnerXml = addMe;
XmlElement rootElement = xmlDocument.DocumentElement;
rootElement.AppendChild(xmlDocFrag);
这导致:
<map><layer>1</layer><layer>2</layer><layer>3</layer></map>
答案 1 :(得分:0)
事情看起来很不错,但我会首先尝试避免最后一个节点的xpath选择,而只是使用它:
rootElement.InsertAfter(xmlDocFrag, rootElement.LastChild);
答案 2 :(得分:0)
我有类似的问题,我使用ImportNode method来解决它
以下是一个小例子,您可以使用它将不同xml(存储在字符串中)的节点添加到xml树中所需节点的示例
string xmlstring =@"<tag>.....</tag>"; // holds xml tree to be appended
XmlDocument xml2 = new XmlDocument();
xml2.Load(@"path_of_main_xml");
XmlDocument xml1 = new XmlDocument();
xml1.Load(new StringReader(xmlString));
// get the node you want to import which in this icase is string
XmlNode elem = xml1.DocumentElement;
// use importNode to import it
XmlNode impnode = xml2.ImportNode(elem,true);
// get the node list of all node of particular tag name
XmlNodeList eNode = xml2.GetElementsByTagName("tag_name_of_parent");
eNode[0].AppendChild(impnode); // append new node
// write back the updates to same file
XmlWriter writer = XmlWriter.Create(@"path_of_main_xml");
xml2.Save(writer);