将兄弟节点插入xml文档

Lil*_*oke 3 .net c# xml xpath xmldocument

我有一个.net Web应用程序,它使用XmlDocument加载XML String.XML的格式如下:

<Sections name="Section Opening Page" PageContentID="201" Template="ReportTags">
  <Chapter Name="Introduction" PageContentID="202" Template="ReportTags">
    <Pages Name="Why this Document?" PageContentID="203" Template="ReportTags" />
    <Pages Name="Target Audience" PageContentID="204" Template="ReportTags" />
  </Chapter>
  <Chapter Name="Detailed Results" PageContentID="205" Template="ReportTags">
    <Pages Name="Question List" PageContentID="206" Template="ReportTags" />
    <Pages Name="Answers" PageContentID="207" Template="ReportTags" />
    <Pages Name="Comments" PageContentID="208" Template="ReportTags" />
  </Chapter>
  <Chapter Name="Appendix 1" PageContentID="209" Template="ReportTags">
    <Pages Name="Page 1" PageContentID="210" Template="ReportTags" />
    <Pages Name="Page 2" PageContentID="211" Template="ReportTags" />
    <Pages Name="Page 3" PageContentID="212" Template="ReportTags" />
  </Chapter>
  <Chapter Name="Appendix 2" PageContentID="213" Template="ReportTags">
    <Pages Name="Page 1" PageContentID="214" Template="ReportTags" />
    <Pages Name="Page 2" PageContentID="215" Template="ReportTags" />
  </Chapter>
</Sections>
Run Code Online (Sandbox Code Playgroud)

举个例子,我想命名为"详细结果"之间"页"命名为"问题清单"和"答案"的"章"下插入一个新节点.我用来做这个的代码如下:

try
{
string sPath = "Sections/Chapter/Pages[@PageContentID='" + selectedNode.Value + "']";
XmlNode xmlNode = xmlDoc.SelectSingleNode(sPath);

XmlElement xNewChild = xmlDoc.CreateElement("Pages");
xNewChild.SetAttribute("Name", "Another New Page");
xNewChild.SetAttribute("PageContentID", Guid.NewGuid().ToString());
xNewChild.SetAttribute("Template", "ReportTags");

xmlDoc.DocumentElement.InsertAfter(xNewChild, xmlNode); 
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
Run Code Online (Sandbox Code Playgroud)

但是,它不起作用,我的新节点没有插入正确的位置,它插在顶部.

任何帮助将不胜感激!!

Cha*_*ger 5

你确定它xmlNode会返回你认为的节点吗?使用调试器逐步完成它.

如果是null,则您插入的节点将DocumentElement作为您描述的子节点添加.如果它返回Pages节点,那么您应该得到一个异常' 参考节点不是该节点的子节点 '.

这是相当自我解释的.代码:

doc.DocumentElement.InsertAfter(xNewChild, xmlNode); 
Run Code Online (Sandbox Code Playgroud)

应该:

xmlNode.ParentNode.InsertAfter(xNewChild, xmlNode);
Run Code Online (Sandbox Code Playgroud)

这说,如果可能的话,我会使用XDocumentXLinq的一部分.API更好,更强大,通常性能更高.一个例子:

var element = x.Descendants("Pages").Single(e => e.Attribute("PageContentID").Value == "206");

var newElement = new XElement("Pages",
                                new XAttribute("Name", "Another New Page"),
                                new XAttribute("PageContentID", Guid.NewGuid().ToString()),
                                new XAttribute("Template", "ReportTags"));

element.AddAfterSelf(newElement);
Run Code Online (Sandbox Code Playgroud)