【问题标题】:Exception occured while tried to use 'InsertBefore' of XmlDocument in C#尝试在 C# 中使用 XmlDocument 的“InsertBefore”时发生异常
【发布时间】:2010-11-10 03:27:16
【问题描述】:


我试图在另一个 xmlnode 之前插入一个 xml 节点,但出现异常提示“引用节点不是此节点的子节点。”

这是我的初始 xml:

<?xml version="1.0" encoding="utf-8" ?>
<Details xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <sampleData>
    <otherNodes></otherNodes>
  </sampleData>
</Details>

我想插入以下 xml 数据(b:dataTobeInserted1,b:dataTobeInserted2 和 b:dataTobeInserted3)作为 Details 的子级,但在 sampleData 之前。

Details1.xml

<?xml version="1.0" encoding="utf-8" ?>
<DataInserted1 xmlns:b="http://example.com/data">
  <b:dataTobeInserted1>
    <b:otherDetails1></b:otherDetails1>
  </b:dataTobeInserted1>
</DataInserted1>

Details2.xml

<?xml version="1.0" encoding="utf-8" ?>
<DataInserted2 xmlns:b="http://example.com/data">
  <b:dataTobeInserted2>
    <b:otherDetails2></b:otherDetails2>
  </b:dataTobeInserted2>
</DataInserted2>

Details3.xml

<?xml version="1.0" encoding="utf-8" ?>
<DataInserted3 xmlns:b="http://example.com/data">
  <b:dataTobeInserted3>
    <b:otherDetails3></b:otherDetails3>
  </b:dataTobeInserted3>
</DataInserted3>

我希望我的输出为

<?xml version="1.0" encoding="utf-8" ?>
<Details xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"  xmlns:b="http://example.com/data">
  <b:dataTobeInserted1>
    <b:otherDetails1></b:otherDetails1>
  </b:dataTobeInserted1>
  <b:dataTobeInserted2>
    <b:otherDetails2></b:otherDetails2>
  </b:dataTobeInserted2>
  <b:dataTobeInserted3>
    <b:otherDetails3></b:otherDetails3>
  </b:dataTobeInserted3>
  <sampleData>
    <otherNodes></otherNodes>
  </sampleData>
</Details>

这是我为实现我想要的输出所做的。

    XmlDocument xmldoc = new XmlDocument();
    xmldoc.Load(@"..\..\initial-Doc.xml");

    xmldoc.DocumentElement.SetAttribute("xmlns:b", "http://example.com/data");


        XmlDocument detail1 = new XmlDocument();
        detail1.Load(@"..\..\DataToBeInserted1.xml");
        XmlNode detail1Node = xmldoc.ImportNode(detail1.DocumentElement, true);

        XmlDocument detail2 = new XmlDocument();
        detail2.Load(@"..\..\DataToBeInserted2.xml");
        XmlNode detail2Node = xmldoc.ImportNode(detail2.DocumentElement, true);

        XmlDocument detail3 = new XmlDocument();
        detail3.Load(@"..\..\DataToBeInserted3.xml");
        XmlNode detail3Node = xmldoc.ImportNode(detail3.DocumentElement, true);

    xmldoc.InsertBefore(detail1Node, xmldoc.DocumentElement.FirstChild);
    xmldoc.InsertBefore(detail2Node, xmldoc.DocumentElement.FirstChild);
    xmldoc.InsertBefore(detail3Node, xmldoc.DocumentElement.FirstChild);

    xmldoc.Save(@"..\..\initial-Doc-new.xml");

是新命名空间导致问题吗?请告诉我哪里出错了。

谢谢 亚历克斯

【问题讨论】:

    标签: c# xml


    【解决方案1】:

    在我看来问题正是异常所说的:“引用节点不是该节点的子节点。”唯一棘手的部分是弄清楚他们指的是哪些节点。 :-)

    这里的“this node”表示您正在调用的InsertBefore()方法的XmlNode,“引用节点”表示InsertBefore( )。所以在下面一行:

    xmldoc.InsertBefore(detail1Node, xmldoc.DocumentElement.FirstChild);
    

    这是说xmldoc.DocumentElement.FirstChild 不是xmldoc 的子代。

    这是真的。 xmldoc.DocumentElement.FirstChildxmldoc.DocumentElement 的孩子。

    因此,如果您将该行更改为以下内容,则问题应该得到解决:

    xmldoc.DocumentElement.InsertBefore(detail1Node, xmldoc.DocumentElement.FirstChild);
    

    【讨论】:

    • 感谢它的工作,非常感谢对我的问题的很好的解释。欣赏:)
    • @Alex:很高兴为您服务!
    • 这也解决了我的问题。我希望这个 XML 文档更清晰一点
    • @KaiCriticallyAcclaimedCooper:我同意,但我不确定如何更清楚地表达它。您将如何编写异常消息?
    • 非常感谢!这解决了我的问题,也拯救了我的一天!
    【解决方案2】:

    您需要制作节点的副本,因为您无法将 xml 节点从一个文档添加到另一个文档。

    认为使用CloneNode() 方法复制节点应该足够了,但如果失败,您可以从节点InnerXmlOuterXml 属性创建一个新节点。

    【讨论】:

    • 如果您查看输出 xml,您会发现其中添加了一个新的命名空间。这会导致问题吗?
    【解决方案3】:

    需要使用XmlDocument类的ImportNode方法:

    XmlNode importedDetailsNode = xmldoc.ImportNode(detail3.DocumentElement, true);
    xmldoc.InsertBefore(importedDetailsNode , xmldoc.DocumentElement.FirstChild);
    

    有关 MSDN 文档,请参阅 here

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多