1

我想使用 VBA 替换 XML 文件中的数据。XML 数据如下所示:

<MarkGrades>
  <Grade MarkGrade="0" Label="3OP" TestBins="1,-1">0</Grade>
  <Grade MarkGrade="2" Label="GOOD" TestBins="2">2</Grade <Grade>           
  <Grade MarkGrade="4" Label="FU" TestBins="31,3135,3136,3312,">4</Grade>
  <Grade MarkGrade="3" Label="PA" TestBins="4016,4022,4029">3</Grade>
  <Grade MarkGrade="5" Label="OS" TestBins="12,13,20012,20013">5</Grade>
</MarkGrades>

我想替换节点中的数据TestBins。IfMarkGrade="4"Label="FU"then 替换TestBinsfrom "2"to中的数据"something"。但我似乎无法弄清楚如何指定:

Dim doc As Object
Set doc = CreateObject("MSXML2.DOMDocument")
Dim isLoaded As Boolean
Dim i As Integer
Dim filePath As Variant
filePath = "C:\Users\xxxx\Desktop\Splitter\test.xml"
isLoaded = doc.Load(filePath)
i = 0

If isLoaded Then
    Dim Grade  As msxml2.IXMLDOMNodeList
    Set Grade = doc.getElementsByTagName("Grade")

    Dim attr As msxml2.IXMLDOMAttribute
    Dim node As msxml2.IXMLDOMElement
    For Each node In Grade
        For Each attr In node.Attributes
        If attr.Name = "TestBins" Then
            i = i + 1
            If i = 3 Then
                attr.Value = SplitterMark.TextBox3.Value
            ElseIf i = 4 Then
                attr.Value = SplitterMark.TextBox4.Value
            ElseIf i = 5 Then
                attr.Value = SplitterMark.TextBox5.Value

            End If
        End If
        Next attr
    Next node

TestBins如果找到计数+1 ,我尝试计数

那工作得很好。但只能与此文件一起使用,因为其他文件并不常见。像这样:

<MarkGrades>
  <Grade MarkGrade="5" Label="OS" TestBins="12,13,20012,20013">5</Grade>
  <Grade MarkGrade="0" Label="3OP" TestBins="1,-1">0</Grade>
  <Grade MarkGrade="4" Label="FU" TestBins="31,3135,3136,3312,">4</Grade>
  <Grade MarkGrade="2" Label="GOOD" TestBins="2">2</Grade <Grade>           
  <Grade MarkGrade="3" Label="PA" TestBins="4016,4022,4029">3</Grade>     
</MarkGrades>

有任何想法吗?

4

1 回答 1

1

您可以使用 xpath 来识别适当的节点和setAttribute值设置。您需要更正您的xml。

Option Explicit

Public Sub test()
    Dim xmlDoc As Object
    Set xmlDoc = CreateObject("MSXML2.DOMDocument")
    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
    Dim elem As Object

    For Each elem In xmlDoc.SelectNodes("//Grade[@MarkGrade='4' or @Label='FU' and @TestBins]")
        elem.setAttribute "TestBins", "Banana"
    Next

    Debug.Print xmlDoc.XML
End Sub

更正了 xml 行:

<Grade MarkGrade="2" Label="GOOD" TestBins="2">2</Grade> 
于 2019-03-22T08:30:50.167 回答