Я ожидаю, что xpath похож на
//Mycategory/*[1]/Text
Мы можем выделить стили, если это необходимо, используя:
//Mycategory[@Style='One']/*[1]/Text
И
//Mycategory[@Style='Two']/*[1]/Text
Моя версия 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 node As IXMLDOMElement
' For Each node In xmlDoc.SelectNodes("//Mycategory/*[1]/Text")
' Debug.Print node.Text
' Next
For Each node In xmlDoc.SelectNodes("//Mycategory[@Style='One']/*[1]/Text")
Debug.Print node.Text
Next
For Each node In xmlDoc.SelectNodes("//Mycategory[@Style='Two']/*[1]/Text")
Debug.Print node.Text
Next
End Sub
Изменить для печати значения стиля перед каждой группой:
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 node As Object, i As Long, xpath As Variant, j As Long
For Each xpath In Array("//Mycategory[@Style='One']/*[1]/Text", "//Mycategory[@Style='Two']/*[1]/Text")
j = 0
For Each node In xmlDoc.SelectNodes(xpath)
For i = 0 To node.ParentNode.ParentNode.Attributes.Length - 1
If node.ParentNode.ParentNode.Attributes(i).nodeName = "Style" And j = 0 Then
Debug.Print node.ParentNode.ParentNode.Attributes(i).nodeName & Chr$(32) & node.ParentNode.ParentNode.Attributes(i).NodeValue
End If
Next
Debug.Print node.Text
j = j + 1
Next
Next
End Sub
С действительной структурой xml:
<MyList>
<Entry Id="33">
<Category>
<Mycategory Style="One">
<Rule Id="37">
<Text>xxx123</Text>
</Rule>
<Rule Id="476">
<Text>123</Text>
</Rule>
</Mycategory>
<Mycategory Style="Two">
<Rule Id="3756">
<Text>xxx456</Text>
</Rule>
<Rule Id="734">
<Text>456</Text>
</Rule>
</Mycategory>
</Category>
</Entry>
<Entry Id="821">
<Category>
<Mycategory Style="One">
<Rule Id="538">
<Text>xxxaaa</Text>
</Rule>
<Rule Id="366">
<Text>aaa</Text>
</Rule>
</Mycategory>
<Mycategory Style="Two">
<Rule Id="894">
<Text>xxxbbb</Text>
</Rule>
<Rule Id="921">
<Text>bbb</Text>
</Rule>
</Mycategory>
</Category>
</Entry>
</MyList>