Конкретный узел в XML-файле использует VBA - PullRequest
1 голос
/ 22 марта 2019

Я хочу заменить данные в файле XML с помощью VBA.Данные 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.Если MarkGrade="4" или Label="FU", замените данные в TestBins с "2" на "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 count +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>

Есть идеи?

1 Ответ

1 голос
/ 22 марта 2019

Вы можете использовать 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> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...