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

问题描述

| 我想将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);
感谢所有的答复和帮助:)     

解决方法

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