gpt4 book ai didi

c# - 尝试在 C# 中使用 XmlDocument 的 'InsertBefore' 时发生异常

转载 作者:数据小太阳 更新时间:2023-10-29 01:42:43 25 4
gpt4 key购买 nike


我试图在另一个 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>

细节2.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");

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

谢谢亚历克斯

最佳答案

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

这里的“this node”是指你正在调用其InsertBefore()方法的XmlNode,而“the reference node”是指InsertBefore 的第二个参数().所以在下面一行:

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

这是说 xmldoc.DocumentElement.FirstChild 不是 xmldoc 的 child 。

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

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

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

关于c# - 尝试在 C# 中使用 XmlDocument 的 'InsertBefore' 时发生异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4132869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com