Ребята .... Это продолжение аналогичного вопроса, который я недавно задал. Как я могу получить конкретное значение из XML-структуры, не перемещаясь по структуре и не перебирая все дочерние узлы? Было предложено использовать XPath.
Предположим следующую упрощенную структуру XML:
<MyWeather>
<sensor location="Front Entry">
<reading label="Temperature">
<title>Front Entry</title>
<label>Temperature</label>
<value>54</value>
<units>F</units>
<lastUpdate>05/27/2013 12:23 AM</lastUpdate>
</reading>
<reading label="Humidity">
<title>Front Entry</title>
<label>Humidity</label>
<value>66</value>
<units>%</units>
<lastUpdate>05/27/2013 12:23 AM</lastUpdate>
</reading>
</sensor>
<sensor location="Patio">
<reading label="Temperature">
<title>Patio</title>
<label>Temperature</label>
<value>46</value>
<units>F</units>
<lastUpdate>05/27/2013 12:23 AM</lastUpdate>
</reading>
<reading label="Humidity">
<title>Patio</title>
<label>Humidity</label>
<value>93</value>
<units>%</units>
<lastUpdate>05/27/2013 12:23 AM</lastUpdate>
</reading>
</sensor>
</MyWeather>
Вот часть моей ASP-страницы:
<%
xmlDoc = CreateObject("Msxml2.DOMDocument")
xmldoc.setProperty ("ServerHTTPRequest", true)
xmlDoc.setProperty ("ProhibitDTD", False)
xmlDoc.validateOnParse = true
' Filename is a sting variable containing the URL
xmlDoc.async = "False"
xmlDoc.load(FileName)
' Error and return code processing done here but removed
For Each el In xmldoc.childNodes
if el.childnodes.length <> 0 then
response.write ("<table align='center' class='auto-style1'>")
for each el2 in el.childnodes
Response.write("<tr><td>" & el2.getattribute("location") & "</td><td></td></tr>")
for each el3 in el2.childnodes
for each el4 in el3.childnodes
if el4.nodename = "value" then
Response.write("<tr><td></td><td>" & el3.getattribute("label") & " " & el4.text & " " & el4.nextSibling.text & "</td></tr>")
exit for
end if
next
next
next
response.write ("</table>")
end if
Next
xmlDoc = Nothing
%>
Мой вопрос относится к коду в разделе "Для каждого el4 в...". Вы видите, что я перебираю дочерние узлы, пока не найду «значение». Затем я вывожу это значение тега, и, поскольку я знаю, что следующий тег (пока что они не изменят его), является тегом «единиц», который я использую nextsibling для получения этого значения. Этот код работает!
Я хотел бы знать следующее: существует ли более прямой путь к этим двум значениям тега для любой комбинации Расположение датчика и Чтение метки без моего процесса итерации.
У меня есть несколько других случаев, когда мне может потребоваться перебрать более 50 элементов, чтобы найти тег, который я ищу.
Я добавил этот код xPath на основе рекомендации из моего предыдущего вопроса. Это, если бы это сработало, заменило бы «для каждого el4 в цикле el3.childnodes» выше.
xmlDoc.setProperty ("SelectionLanguage", "XPath")
oNode = xmldoc.selectSingleNode("//reading[@label='Temperaure']/units")
o2Node = xmldoc.selectSingleNode("//reading[@label='Temperaure']/value")
if oNode is nothing or o2node is nothing then
Response.write("<tr><td></td><td> Nothing found for value or units </td><td>" & el3.getattribute("label") & "</tr>")
else
Response.write("<tr><td></td><td>" & el3.getattribute("label") & " " & o2Node.text & " " & oNode.text & "</td></tr>")
end if
Однако это не сработало для меня. Я пробовал несколько вариантов: без знака @ и с полным путем в операторах oNode, т.е. /MyWeather/sensor/reading/...
Моя проверка на пустой oNode и/или O2Node всегда верна.
Есть идеи?..... РДК