Как найти порядковый номер элемента в XML с помощью VBScript и XPATH - PullRequest
2 голосов
/ 21 апреля 2010

У меня есть такой XML

<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader">
    <int name="status">0</int>
    <int name="QTime">1</int>
    <lst name="params">
        <str name="start">num</str>
        <str name="fl">string</str>
        <str name="q">string</str>
        <str name="rows">num</str>
        <str name="op">string</str>
        <str name="sort">string</str>
    </lst>
</lst>
<result name="response" numFound="20" start="1">
    <doc>
        <arr name="URL"><str>string</str></arr>
        <arr name="ID"><int>1</int></arr>
    </doc>
    <doc>
        <arr name="URL"><str>string</str></arr>
        <arr name="ID"><int>2</int></arr>
    </doc>  
    <doc>
        <arr name="URL"><str>string</str></arr>
        <arr name="ID"><int>3</int></arr>
    </doc>      
    <doc>
        <arr name="URL"><str>string</str></arr>
        <arr name="ID"><int>4</int></arr>
    </doc>      
</result>
</response>

Мне нужно найти порядковый номер элемента doc, у которого дочерний узел arr / id имеет текстовое значение 2

Я использую классический ASP

спасибо

Ответы [ 2 ]

2 голосов
/ 21 апреля 2010

Используйте, например,

Set doc = Server.CreateObject("Msxml2.DOMDocument.3.0")
doc.async = False
If doc.load(Server.MapPath("input.xml")) Then
  doc.setProperty "SelectionLanguage", "XPath"
  Set docEl = doc.selectSingleNode("response/result/doc[arr[@name = 'ID'] = 2]")
  If Not(doc Is Nothing) Then
    Response.Write(docEl.selectNodes("preceding-sibling::doc").length)
  Else
    Response.Write("Not found.")
  End If
Else
  Response.Write doc.parseError.reason
End If

Как уже отмечалось, если вы хотите, чтобы индекс начинался с 1, а не с 0, вам нужно добавить 1 к результату.

2 голосов
/ 21 апреля 2010

Вы не можете напрямую, вы должны считать узлы.Я бы сделал

Dim xpath, docNode, position

xpath = "/response/result/doc[arr[@name='ID'] = 2]"
Set docNode = XmlDoc.SelectSingleNode(xpath)

If docNode Is Nothing  ' i.e. not found
  position = 0
Else
  position = docNode.SelectNodes("./preceding-sibling::doc").Length + 1
End If
...