【问题标题】:Appending a Child to a Node Elsewhere in an XML Document将子节点附加到 XML 文档中的其他节点
【发布时间】:2017-07-27 17:22:33
【问题描述】:

以下 VBA 代码采用 XML 文件并将特定节点附加到文档中的其他节点:

Dim xmlFilePath$, newFilePath$
Dim DOM As MSXML2.DOMDocument
Dim Node As IXMLDOMNode
Dim fso As Scripting.FileSystemObject
Dim itm As IXMLDOMNode

xmlfilepath = "Path"

newfilepath = "Path_2"

Set DOM = CreateObject("MSXML2.DOMDocument.6.0")

DOM.Load xmlFilePath

For Each Node In DOM.DocumentElement.getElementsByTagName("Tag")
   For Each itm In Node.ParentNode.NextSibling.ChildNodes
            itm.appendChild Node.CloneNode(True)
    Next
Next

Set fso = CreateObject("Scripting.FileSystemObject")

Set DOM = Nothing
Set fso = Nothing
Set Node = Nothing

End Sub

此代码在编写时运行良好。但是,如果循环

For Each Node In DOM.DocumentElement.getElementsByTagName("Tag")
   For Each itm In Node.ParentNode.NextSibling.ChildNodes
            itm.appendChild Node.CloneNode(True)
    Next
Next

改为

For Each Node In DOM.DocumentElement.getElementsByTagName("Tag")
   For Each itm In Node.ParentNode.ParentNode
            itm.appendChild Node.CloneNode(True)
    Next
Next

我收到“需要对象”错误。如果我改为使用Node.ParentNode.ParentNode.ChildNodes,则不会出现错误,但我尝试附加的节点会放置在已经存在的子节点内,因此结果类似于<a>Example<b>More_Writing</b></a>

有没有办法让路径Node.ParentNode.ParentNode 被接受为有效,或者我应该以不同的方式处理这个问题?

【问题讨论】:

    标签: xml vba


    【解决方案1】:

    Node.ParentNode.ParentNode 将返回单个节点,而不是集合,因此您不需要内部 For Each 循环:

    For Each Node In DOM.DocumentElement.getElementsByTagName("Tag")
       Node.ParentNode.ParentNode.appendChild Node.CloneNode(True)
    Next
    

    【讨论】:

    • 感谢蒂姆,解决了错误,但由于某种原因,实际上没有任何内容被替换到文档中。
    • 创建一个您可以分配Node.ParentNode.ParentNode 的变量,然后在上面添加一个Watch 并进行一些调试——这是您所期望的吗?如果没有示例 XML,很难准确判断发生了什么。
    【解决方案2】:

    Tim Williams 提供了运行良好的代码。要解决您的 XML 不更新的问题,您需要像打开 XML 一样保存您的 XML

    'Open XML
    DOM.Load xmlFilePath
    
    'Edit XML
    For Each Node In DOM.DocumentElement.getElementsByTagName("Tag")
        Node.ParentNode.ParentNode.appendChild Node.CloneNode(True)
    Next
    
    'Save XML
    Dom.Save xmlFilePath
    

    【讨论】:

      猜你喜欢
      • 2016-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多