2013-09-27 4 views
3

Я пытаюсь использовать XPath и стрип XML в первый раз I,с помощью XPath для извлечения одного узла из XML-файла

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

' Create a WebRequest to the remote site 
    Dim request As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create("http://hatrafficinfo.dft.gov.uk/feeds/datex/England/CurrentRoadworks/content.xml") 
    Dim response As System.Net.HttpWebResponse = request.GetResponse() 

    ' Check if the response is OK (status code 200) 
    If response.StatusCode = System.Net.HttpStatusCode.OK Then 


     Dim stream As System.IO.Stream = response.GetResponseStream() 
     Dim reader As New System.IO.StreamReader(stream) 
     Dim contents As String = reader.ReadToEnd() 
     Dim document As New System.Xml.XmlDocument() 

     document.LoadXml(contents) 

     Dim node As System.Xml.XmlNode 

     For Each node In document 
      Debug.Print(node.SelectNodes("/situation").ToString()) 
     Next node 

    Else 

     Throw New Exception("Could not retrieve document from the URL, response code: " & response.StatusCode) 

    End If 

благодарит за любую помощь, которую любой может дать !!!

здесь начало XML doument

<d2LogicalModel modelBaseVersion="1.0"> 
    <exchange> 
    <supplierIdentification> 
     <country>gb</country> 
     <nationalIdentifier>NTCC</nationalIdentifier> 
    </supplierIdentification> 
    </exchange><payloadPublication xsi:type="SituationPublication" lang="en"> <publicationTime>2013-09-27T16:09:02+01:00</publicationTime> 

гб

ответ

1

Во-первых, вам нужно вызвать метод выбора в документе, а не на нулевой переменной узла:

'This will not work because node is null (Nothing) 
node.SelectNodes("/situation") 

'This will work 
document.SelectNodes("/situation") 

SelectNodes метод возвращает коллекцию узлы. Если все, что вы хотите, это первый один, вызовите SelectSingleNodes вместо этого, как это:

node = document.SelectSingleNode("/situation") 

Затем, вместо того, чтобы вызывать ToString на узле, вызовите либо InnerXml, InnerText или OuterXml, в зависимости от ваших предпочтений, например:

node = document.SelectSingleNode("/situation") 
If node IsNot Nothing Then 
    Debug.Print(node.InnerText) 
Else 
    Debug.Print("Node does not exist") 
End If 

Однако, посмотрев на фактический XML, который вы пытаетесь прочитать, он никогда не найдет узел. /situation найдет только узел, если он является корневым элементом, но в фактическом XML-документе он находится здесь: /d2LogicalModel/payloadPublication/situation. Однако есть и вторая проблема. Для корневого элемента определено пространство имен по умолчанию: xmlns="http://datex2.eu/schema/1_0/1_0". Поэтому вам нужно явно указать пространство имен в вашем выборе, например:

Dim doc As New XmlDocument() 
doc.Load("http://hatrafficinfo.dft.gov.uk/feeds/datex/England/CurrentRoadworks/content.xml") 
Dim nsmgr As New XmlNamespaceManager(doc.NameTable) 
nsmgr.AddNamespace("x", "http://datex2.eu/schema/1_0/1_0") 
Dim node As XmlNode = doc.SelectSingleNode("/x:d2LogicalModel/x:payloadPublication/x:situation", nsmgr) 
If node IsNot Nothing Then 
    Debug.Print(node.InnerXml) 
Else 
    Debug.Print("Node does not exist") 
End If 

Обратите внимание, что нет необходимости создавать HttpWebRequest поскольку XmlDocument класса способен загружать непосредственно из URI.

+0

получение сообщения об ошибке Ссылка на объект не установлена ​​в экземпляр объекта. – user2247671

+0

код выглядит как Dim node As System.Xml.XmlNode node = document.SelectSingleNode ("/ Situation") Debug.Print (node.InnerText) – user2247671

+0

Не удается ли он на строке 'Debug.Print'? Если это так, это потому, что элемент '/ Situation' не существует в документе XML. Перед печатью значения вы должны проверить «Если узел IsNot Nothing». Таким образом, если узел не существует, вы не будете вызывать исключение. Я обновил свой пример, чтобы продемонстрировать, как это сделать. –

1

Попробуйте это SelectSingleNode функции.

Dim xrn As XmlNode 
Dim xd As New XmlDocument() 
xd.LoadXml(xml) 
xrn = xd.SelectSingleNode("//") 

If Not IsNothing(xrn) Then 
    mac = xrn.InnerText 
End If 

ozoid ..

+0

ozoid? Он выглядит более треугольным, если что угодно ... :) –

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