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

本文关键字:之后 插入 XML 片段 元素 最后一个 节点 | 更新日期: 2023-09-27 17:57:59

我想在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然后尝试在这个节点上插入After()是不正确的。最好选择上面的级别,即MAP,然后选择AppendChild()。见下文:

XmlDocumentFragment xmlDocFrag = xmlDocument.CreateDocumentFragment();
xmlDocFrag.InnerXml = inputXML;
XmlElement mapElement = (XmlElement)xmlDocument.SelectSingleNode(@"//MAP[last()]");
mapElement.AppendChild(xmlDocFrag);

感谢所有的回复和帮助:)

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

考虑到您需要使用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>

情况看起来不错,但我首先会尽量避免为最后一个节点选择xpath,而只使用以下内容:

rootElement.InsertAfter(xmlDocFrag, rootElement.LastChild);

我遇到了类似的问题,我使用ImportNode方法来解决它

下面是一个小示例,说明如何使用它将来自不同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);