2013-11-17 5 views
2

Я использую следующий код, чтобы получить значение элемента «DistanceUnit» в моем XML:VBA Excel SelectSingleNode синтаксис

Dim xmlDoc As MSXML2.DOMDocument60 
Dim xmlElement As MSXML2.IXMLDOMElement 

Set xmlDoc = New MSXML2.DOMDocument60 
xmlDoc.async = False 
xmlDoc.validateOnParse = False 

xmlDoc.LoadXML strResponse 
Set xmlElement = xmlDoc.DocumentElement 

Set curNode = xmlElement.SelectSingleNode("/Response/ResourceSets/ResourceSet/Resources/Route/DistanceUnit") 

При отладке я вижу, что curNode НИЧЕГО. Я не понимаю, почему. Когда я использую itterative код, кажется, работает нормально:

Set xmlRoot = xmlDoc.DocumentElement 
Set xmlChildren = xmlRoot.ChildNodes 

For Each xmlTemplate In xmlChildren 
    If xmlTemplate.nodeName = "ResourceSets" Then 
     MsgBox "found!" 
     Exit For 
    End If 
Next xmlTemplate 

Я не хочу использовать itterative код, так как я знаю точный XPath к элементу ...

Этот код работать как хорошо, но я просто хочу, чтобы использовать XPath:

Set curNode = xmlRoot.ChildNodes(6).ChildNodes(0).ChildNodes(1).ChildNodes(0).ChildNodes(2) 
MsgBox curNode.Text 

Спасибо, Ли

Мой XML:

<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.microsoft.com/search/local/ws/rest/v1"> 
    .... 
    <StatusCode>200</StatusCode> 
    <StatusDescription>OK</StatusDescription> 
    <AuthenticationResultCode>ValidCredentials</AuthenticationResultCode> 
    <ResourceSets> 
     <ResourceSet> 
      <EstimatedTotal>1</EstimatedTotal> 
      <Resources> 
       <Route> 
        ..... 
        <DistanceUnit>Kilometer</DistanceUnit> 
        ..... 
       </Route> 
      </Resources> 
     </ResourceSet> 
    </ResourceSets> 
</Response> 

ответ

2

Попробуйте указать префикс пространства имен для объявления пространства имен по умолчанию (см this KB article для получения дополнительной информации):

Set xmlDoc = New MSXML2.DOMDocument60 
xmlDoc.async = False 
xmlDoc.validateOnParse = False 

xmlDoc.setProperty "SelectionNamespaces", "xmlns:a='http://schemas.microsoft.com/search/local/ws/rest/v1'" 

xmlDoc.LoadXML strResponse 
Set xmlElement = xmlDoc.DocumentElement 

Set curNode = xmlElement.SelectSingleNode("/a:Response/a:ResourceSets/a:ResourceSet/a:Resources/a:Route/a:DistanceUnit") 
+0

Спасибо :), наконец, это работает :) – user429400

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