如何使用VBA读取xml文件并更改子节点中的某些值,然后以其他名称或相同名称写入文件?

时间:2019-07-15 12:51:06

标签: xml vba

我有一个xml文件。但是我需要编辑一些值并将其保存为新文件或相同文件。

例如:需要将“速度”值从100修改为200,然后保存。

此外,我想遍历所有“ Pathnode”子对象以达到“变量”,这是我的兴趣。 “路径节点”的数量可能会在“输入”和“变量”之间变化

<AnalysisCase Name="case 1\Load cycle"/>
<Inputs>    
 <PathNode Name="New Design">
  <PathNode Name="Input">
    <PathNode Name="## Property ##">
      <PathNode Name="Component Load Case">
        <Variable Name="Speed" Value="100" />
        <Variable Name="Torque" Value="150"/>
      </PathNode>
    </PathNode>
   </PathNode>
 </PathNode>
</Inputs>

2 个答案:

答案 0 :(得分:1)

您可以使用HTMLObject库读入HTMLDocument解析器,然后使用querySelector和SetAttribute

HTML.querySelector("[Name=Speed]").SetAttribute "Value", "200"

如果使用xml解析器并读入xml文档变量,则原理相同。请参阅第二个代码示例。

请注意,您的xml必须格式正确,而上述格式则不能。我将您的第一个元素视为应正确形成的根。

我认为需要第一场比赛。如果有多个匹配项,请使用

querySelectorAllHTMLDocument并从i = 0循环到匹配项。长度-1

使用

xmlDoc.SelectNodesDOMDocumentFor Each在比赛中的每场比赛中


HTMLDocument:

要将本地xml读入HTMLDocument变量,可以使用FileSystemObject

Public Function GetHTMLFileContent(ByVal filePath As String) As HTMLDocument
    Dim fso As Object, hFile As Object, hString As String, html As HTMLDocument
    Set html = New HTMLDocument
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set hFile = fso.OpenTextFile(filePath)

    Do Until hFile.AtEndOfStream
        hString = hFile.ReadAll()
    Loop
    html.body.innerHTML = hString
    Set GetHTMLFileContent = html

End Function

XML DOMDocument:

Option Explicit
Public Sub test()
    Dim xmlDoc As Object, node As Object ' IXMLDOMElement  ''<early  bound requires reference to Microsoft XML v3 or v6 depending on your Excel version
    Set xmlDoc = CreateObject("MSXML2.DOMDocument") 'New MSXML2.DOMDocument60
    With xmlDoc
        .validateOnParse = True
        .setProperty "SelectionLanguage", "XPath"
        .async = False
        If Not .Load("C:\Users\User\Desktop\Test.xml") Then
            Err.Raise .parseError.ErrorCode, , .parseError.reason
        End If
    End With
    Set node = xmlDoc.SelectSingleNode("//Variable[@Name='Speed' and @Value]")
    If Not node Is Nothing Then
         node.setAttribute "Value", "200"
    End If
End Sub

测试xml

<AnalysisCase Name="case 1\Load cycle">
    <Inputs>
        <PathNode Name="New Design">
            <PathNode Name="Input">
                <PathNode Name="## Property ##">
                    <PathNode Name="Component Load Case">
                        <Variable Name="Speed" Value="100" />
                        <Variable Name="Torque" Value="150" />
                    </PathNode>
                </PathNode>
            </PathNode>
        </PathNode>
    </Inputs>
</AnalysisCase>

参考文献:

  1. Microsoft HTML对象库

答案 1 :(得分:0)

您要问的是如何在vba中读取和写入文本文件(因为这就是xml文件)。

我建议您阅读this article关于该主题的知识,该主题应该为您提供入门所需的所有信息。