2015-09-25 2 views
0

У меня есть файл XML, который имеет много узлов с тем же именем. Мне нужно связаться с конкретным узлом, не по его названию, ни по его атрибуту, а по его заказу внешнего вида в XML-файле. Например:Как добраться до определенного узла XML по его номеру (порядку)?

<category field="X"/> 
<class LN="RF"/> 
<category field="Y"/> 
<p name="state"/> 
<category field="Z"/> 
<category field="A"/> 

Так что мне нужно, чтобы достичь узла <category field="Z"/>, например, не потому, что его атрибут ="Z", но из-за его порядка является третьим в группе category узлов.

ответ

3

Используйте вхождение узла с [] или position() функциями от XPath:

Public Sub XMLData() 
    Dim XmlFile 
    Dim doc, item 
    Dim fso, stdout 

    Set fso = CreateObject ("Scripting.FileSystemObject") 
    Set stdout = fso.GetStandardStream (1) 

    XmlFile = "C:\Path\To\xmlfile.xml" 
    doc.Load XmlFile 

    For Each item In doc.SelectNodes("//category[3]") 'OR //category[position()=3]' 
    stdout.WriteLine item.Attributes.ItemOf("field").InnerText 
    Next 

    Set fso = Nothing 
End Sub 
0

Выберите <category> узлы с XPath expression, а затем использовать метод item для выбора п-й элемент из полученного коллекции:

xmldata = "<root>" & _ 
    "<category field=""X""/>" & _ 
    "<class LN=""RF""/>" & _ 
    "<category field=""Y""/>" & _ 
    "<p name=""state""/>" & _ 
    "<category field=""Z""/>" & _ 
    "<category field=""A""/>" & _ 
    "</root>" 

Set xml = CreateObject("Msxml2.DOMDocument") 
xml.async = False 
xml.loadXml xmldata 

If xml.parseError <> 0 Then 
    WScript.Echo xml.parseError.Reason 
    WScript.Quit xml.parseError 
End If 

Set categories = xml.selectNodes("//category") 
Set thirdCategory = nodes.item(2) 

WScript.Echo node.getAttribute("field") 

Следует отметить, что индекс равен нулю основе, поэтому необходимо использовать индекс 2 для третьего элемента.

Смежные вопросы