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

Vid*_*dar 3 c# 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>
Run Code Online (Sandbox Code Playgroud)

我想在最后一个LAYER元素之后插入的XML片段是:

<LAYER name="My third Layer">
     <DATASET name="whatever dataset" /> 
     <SYMBOLOGY> 
       <SYMBOL colour="yellow" />
     </SYMBOLOGY>    
</LAYER> 
Run Code Online (Sandbox Code Playgroud)

我使用的代码是:

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.
Run Code Online (Sandbox Code Playgroud)

关于我在这里做错的任何想法都会非常感激.我的XPath查询似乎找不到它似乎选择了正确的最后一层,它只是因为某些奇怪的原因而不会插入它.

更新/解决方案 - 如何使用XPATH执行此操作

最后在XPath中找到了它 - 看到下面的代码,我认为基本上没有首先选择正确的父节点,选择最后一个LAYER然后尝试在此节点上使用InsertAfter()是不正确的.最好选择上面的级别,即MAP然后是AppendChild().见下文:

XmlDocumentFragment xmlDocFrag = xmlDocument.CreateDocumentFragment();
xmlDocFrag.InnerXml = inputXML;

XmlElement mapElement = (XmlElement)xmlDocument.SelectSingleNode(@"//MAP[last()]");
mapElement.AppendChild(xmlDocFrag);
Run Code Online (Sandbox Code Playgroud)

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

arc*_*ain 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);
Run Code Online (Sandbox Code Playgroud)

这导致:

<map><layer>1</layer><layer>2</layer><layer>3</layer></map>
Run Code Online (Sandbox Code Playgroud)