将XML节点添加到XmlDocument中的特定节点

时间:2012-06-19 03:50:31

标签: asp.net xml vb.net

我有两个XmlDocuments都指定了命名空间属性。两个文档具有相同的结构,但包含不同的数据。我似乎无法从第二个文档中添加到同一节点树末尾的一个文档中获取特定节点树。以下是我的两份文件的例子:

文件#1:

<?xml version="1.0"?>
<rootnode xmlns="http://www.mynamespace.com/Service/2012-06-18">
    <node0>
    </node0>
    <node1>
        <Item>
            <Id>1</Id>
            ....
        </Item>
        <Item>
            <Id>2</Id>
            ....
        </Item>
        <Item>
            <Id>3</Id>
            ....
        </Item>
    </node1>
</rootnode>

文件#2

<?xml version="1.0"?>
<rootnode xmlns="http://www.mynamespace.com/Service/2012-06-18">
    <node0>
    </node0>
    <node1>
        <Item>
            <Id>4</Id>
            ....
        </Item>
        <Item>
            <Id>5</Id>
            ....
        </Item>
        <Item>
            <Id>6</Id>
            ....
        </Item>
    </node1>
</rootnode>

我想要完成的事情:

<?xml version="1.0"?>
<rootnode xmlns="http://www.mynamespace.com/Service/2012-06-18">
    <node0>
    </node0>
    <node1>
        <Item>
            <Id>1</Id>
            ....
        </Item>
        <Item>
            <Id>2</Id>
            ....
        </Item>
        <Item>
            <Id>3</Id>
            ....
        </Item>
        <Item>
            <Id>4</Id>
            ....
        </Item>
        <Item>
            <Id>5</Id>
            ....
        </Item>
        <Item>
            <Id>6</Id>
            ....
        </Item>
    </node1>
</rootnode>

我尝试将所有<Item>个节点从一个文档添加到另一个文档,同时保持所有其他节点的结构。任一文档中都有任意数量的<Item>个节点。每个<Item>节点都有一个深层嵌套的节点数,用于描述该项。

Dim dstdoc As XmlDocument = myobject1.XmlDocument
Dim srcdoc As XmlDocument = myobject2.XmlDocument

Dim nsmgr As New XmlNamespaceManager(New NameTable)
nsmgr.AddNamespace("ns", "http://www.mynamespace.com/Service/2012-06-18")

Dim xpath As String = "ns:rootnode/ns:node1//ns:Item"

Dim copiedNode As XmlNode = dstdoc.ImportNode( _
                            srcdoc.SelectSingleNode(xpath, nsmgr), True)
dstdoc.DocumentElement().AppendChild(copiedNode)

我当然知道这是错的......我尝试了几种不同的方法。此特定方法将所有<Item>个节点添加到目标文档,但它将它们添加到文档的最底部,而不是在最后一个<Item>之后。

有人可以告诉我如何将特定节点树XmlDocument添加到另一个文档中的特定位置吗?同样,涉及一个命名空间,<Item>节点在每个节点下都有嵌套的节点/元素。

注意:<Id>个节点的示例数据仅显示唯一性。我永远不会指望任何编号。每个<Item>节点的顺序完全不重要。我只是假设在目标文档中的最后一个节点之后添加额外的<Item>节点是最容易的。

1 个答案:

答案 0 :(得分:2)

你很亲密。这一行不正确:

dstdoc.DocumentElement().AppendChild(copiedNode)

明确表示要附加到“文档元素”(表示根元素)。如果要附加到目标文档中的特定元素,则首先必须获取对该目标元素的引用:

Dim destElement As XmlNode = dstdoc.SelectSingleNode("ns:rootnode/ns:node1", nsmgr)
For Each sourceNode in srcdoc.SelectNodes(xpath, nsmgr)
    Dim imported As XmlNode = dstdoc.ImportNode(sourceNode, True)
    destElement.AppendChild(imported)
Next