【问题标题】:cant append child nodes to a parent node( VBA-XML)不能将子节点附加到父节点(VBA-XML)
【发布时间】:2018-05-10 15:22:16
【问题描述】:

这是我的 VBA 代码,我在其中使用 excel 数据表修改 XML。 xml 在这里:https://www.jiocloud.com/s/?t=SzqFJhEABfsTQfZW&s=a2

function fnUpdateXMLByTags()
Dim mainWorkBook As Workbook
Dim wrsht As Worksheet


Set mainWorkBook = ActiveWorkbook
Set wrsht = mainWorkBook.Sheets("Sheet1")
wrsht.Activate

Dim oXMLFile As MSXML2.DOMDocument60
Set oXMLFile = New MSXML2.DOMDocument60
oXMLFile.async = False
oXMLFile.validateOnParse = False
XMLFileName = "Z:\IPC\IPC1752A_WK-200264-000 - Copy (2).xml"
XmlNamespaces = "xmlns:d='http://webstds.ipc.org/175x/2.0'"
oXMLFile.SetProperty "SelectionNamespaces", XmlNamespaces

For i = 3 To 5
  If Not IsEmpty(mainWorkBook.Sheets("Sheet1").Range("A" & i)) Then

        PartID = mainWorkBook.Sheets("Sheet1").Range("A" & i).Value
        PartName = mainWorkBook.Sheets("Sheet1").Range("B" & i).Value
        MaterialName = mainWorkBook.Sheets("Sheet1").Range("D" & i).Value
        MassAmount = mainWorkBook.Sheets("Sheet1").Range("F" & i).Value
        MassUnit = mainWorkBook.Sheets("Sheet1").Range("G" & i).Value
        Path = "D:\New folder\" & PartID & ".xml"

        If oXMLFile.Load(XMLFileName) Then

            Set PartIDNodes = oXMLFile.SelectNodes("//@itemNumber")
            Set PartNameNodes = oXMLFile.SelectNodes("//@itemName")
            Set MaterialNameNodes = oXMLFile.SelectNodes("//@name")
            Set MassAmountNodes = oXMLFile.SelectNodes("//@value")
            Set MassUnitNodes = oXMLFile.SelectNodes("//@UOM")
            PartIDNodes(0).NodeValue = Part_ID
            PartNameNodes(0).NodeValue = PartName
            MaterialNameNodes(5).NodeValue = MaterialName
            MassAmountNodes(1).NodeValue = MassAmount
            MassUnitNodes(1).NodeValue = MassUnit

        End If

    Else:
        If IsEmpty(mainWorkBook.Sheets("Sheet1").Range("D" & i)) Then
            Substancename = mainWorkBook.Sheets("Sheet1").Range("H" & i).Value
            CASNumber = mainWorkBook.Sheets("Sheet1").Range("I" & i).Value
            SubAmount = mainWorkBook.Sheets("Sheet1").Range("J" & i).Value
           Set SubstanceCategoryNode = oXMLFile.SelectNodes("//d:SubstanceCategory")
           Set Substancenode = oXMLFile.createElement("d:Substance")
           Substancenode.Text = "<SubstanceID identity="" authority=""/> <Amount value="" UOM=""/> "
           SubstanceCategoryNode.appendChild (Substancenode)
             "throwwin error here"

           oXMLFile.Save Path
         End If


End If


Next i

End Function

当我将子级附加到父级时,它会抛出“对象不支持此属性或方法”

请指出我错在哪里。是否有任何其他方法可以将子节点附加到父节点

【问题讨论】:

    标签: xml vba appendchild


    【解决方案1】:

    原因是因为 SubstanceCategoryNode 的类型是 IXMLDOMSelection。它是一个选择,只是 XML 树的一个视图。要构建/附加元素,我实际上会创建一个元素,例如上面的 Substancenode 变量...

    Set SubstanceCategoryNode = oXMLFile.createElement("d:SubstanceCategory")
    

    ...左右

    使用监视窗口/TypeName() 函数

    【讨论】:

    • 是的,你是对的@thomasM,它是一个选择,所以它不能附加它。
    • 您的回答和建议...教人钓鱼,而不是授人以渔!非常感谢。
    【解决方案2】:

    只是为了好玩。原始来源有四个“物质”节点,位于物质类别下。

    之前:

    您可以附加一个子节点,即添加另一个 Substance 节点(我猜?) 一种简单的方法是克隆现有的,然后更改其属性,例如

    Option Explicit
    
    Public Sub test()
        Dim xml As String, doc As MSXML2.DOMDocument60
        xml = [A1].Text
        Set doc = New MSXML2.DOMDocument60
    
        If Not doc.LoadXML(xml) Then
            Err.Raise doc.parseError.ErrorCode, , doc.parseError.reason
            Exit Sub
        End If
    
        Dim node As IXMLDOMElement, newNode As IXMLDOMElement
        Set node = doc.DocumentElement.LastChild.ChildNodes(1).FirstChild.FirstChild.ChildNodes(1).ChildNodes(1) '<== MaterialInfo > HomogeneousMaterialList>HomogeneousMaterial>SubstanceCategoryList > SubstanceCategoryListID>SubstanceCategory
    
       Set newNode = node.appendChild(node.LastChild.CloneNode(True))
    
       'Adjust newNode properties
        Stop
    End Sub
    

    之后:

    【讨论】:

    • 您好,@qharr 感谢您的回答。回复晚了非常抱歉。在您的帮助和建议下,我确实解决了我的问题。非常感谢。仅供参考,我创建了另一个只有物质类别的 XML,并使用从那里导入了一个节点。设置 Substancenode = oXMLFile.importNode(oXMLFile2.DocumentElement.LastChild, True)
    • 嗨@pavankumar。做得好。请记住发布作为答案以帮助他人并发布至少足够的代码以帮助人们重现。请记住,如果您认为上述内容有帮助,您可以在我认为达到 15 分时投票。 stackoverflow.com/help/someone-answers
    • 这就是问题所在。我还不能投票。还没有达到那个门槛。是的,正如您所建议的那样,我已将其发布为答案
    • 你会成功的!
    【解决方案3】:

    答案很简单。而不是

    Set SubstanceCategoryNode = oXMLFile.SelectNodes("//d:SubstanceCategory")
    

    我必须使用这个。

    Set SubstanceCategoryNode = oXMLFile.SelectsingleNode("//d:SubstanceCategory")
    

    从 SelectNodes 到选择单个节点。

    感谢@qharr 和@ThomasMX 的支持。

    【讨论】:

    • 这是否添加了一个节点?还是选择第一个节点?是时候给我做些功课了....
    • 它选择节点(唯一的节点)。如果你需要的话,也许我可以把完整的代码分享给你(我所有的工作)。
    • 大声笑。因为您的问题是如何附加未选择的节点。 Select 是我记得回答的另一个问题,append 是我在这里回答的问题。给出一个实际上不是所提出问题的答案是令人困惑的。
    • 我认为你应该编辑这个错误的自动答案......正如 ThomasMX 所说,SelectNodes 或 SelectSingleNode 都返回一个 IXMLDOMSelection,我们不能对它们做“动词”,比如添加、追加、删除...你需要按照 QHar 所说的(对我来说很复杂......)或 ThomasMX 所说的:首先做一个Set SubstanceCategoryNode = oXMLFile.createElement("d:SubstanceCategory"),然后你可以追加,添加,InsertBefore;例如:Set newNode = node.appendChild(SubstanceCategoryNode) Here is a very easy and complete tutorial
    猜你喜欢
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多