如何解决在最后一个特定节点/元素之后插入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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。