2013-04-10 7 views
1

Итак,Получить конкретные узлы из XPathDocument

У меня есть этот XPathDocument что я получаю обратно из POST-запроса, и это в основном выглядит следующим образом:

<eExact xsi:noNamespaceSchemaLocation="eExact-XML.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  
    <Messages>  
    <Message type="0">   
     <Topic code="GLTransactions" node="GLTransaction">   
     <Data keyAlt="138100138" />   
     </Topic>   
     <Date>2013-04-10T16:57:00</Date>   
     <Description> Topic [GLTransactions] Bestaat reeds - Boekstuknummer: 138100138, Dagboek: 81, Boekjaar: 2013</Description>  
    </Message>  
    <Message type="2">   
     <Topic code="GLTransactions" node="Account">   
     <Data keyAlt="577" />   
     </Topic>   
     <Date>2013-04-10T16:57:00</Date>   
     <Description>Bijgewerkt</Description>  
    </Message>  
    <Message type="2">   
     <Topic code="GLTransactions" node="GLTransaction">   
     <Data keyAlt="138100140" />   
     </Topic>   
     <Date>2013-04-10T16:57:00</Date>   
     <Description>Aangemaakt</Description>  
    </Message>  
    </Messages> 
</eExact> 

Это слишком много информации , как мне нужно только следующие вещи: Для каждого сообщения где темы узла = «GLTransaction»ИMessa ge type = 2, мне нужен Data KeyAlt и Описание.

Язык программирования - VB.NET.

Спасибо большое, ребята!

+0

Ваш вопрос смущает меня. Вы хотите сказать, что вы возвращаете этот * XML-документ * из POST-запроса и пытаетесь его прочитать с помощью класса XPathDocument? –

+0

Да, тем временем я нашел ответ и разместил его здесь. –

ответ

1

XPath, что вам нужно использовать для выбора соответствующих Message элементов:

//Message[(Topic/@node='GLTransaction') and (@type='2')] 

Например:

Dim doc As New XPathDocument("test.xml") 
Dim nav As XPathNavigator = doc.CreateNavigator() 
Dim iter As XPathNodeIterator = nav.Select("//Message[(Topic/@node='GLTransaction') and (@type='2')]") 
While iter.MoveNext 
    Dim keyAlt As String = iter.Current.SelectSingleNode("Topic/Data/@keyAlt").Value 
    Dim description As String = iter.Current.SelectSingleNode("Description").Value 
End While 

Или, используя XmlDocument:

Dim doc As New XmlDocument() 
doc.Load("test.xml") 
For Each message As XmlNode In doc.SelectNodes("//Message[(Topic/@node='GLTransaction') and (@type='2')]") 
    Dim keyAlt As String = message.SelectSingleNode("Topic/Data/@keyAlt").InnerText 
    Dim description As String = message.SelectSingleNode("Description").InnerText 
Next 
+0

Спасибо. Выяснил, что уже, но ваш ответ правильный. –

0

Я понял, что фильтрация по типу и узлу может быть выполнена с помощью простой инструкции if:

Dim xml As New XPathDocument(stream) 
    Dim nav As XPathNavigator = xml.CreateNavigator() 
    Dim Messages As XPathNodeIterator = nav.Select("/eExact/Messages/Message") 
    Dim exactID As String 
    Dim topic As String 
    Dim description As String 

    Dim bErrorsFound As Boolean = False 

    If Messages.Count > 0 Then 
     While Messages.MoveNext() 
      nav = Messages.Current 
      errorCode = nav.GetAttribute("type", String.Empty) 

      topic = nav.Evaluate("string(Topic/@node)") 
      exactID = nav.Evaluate("string(Topic/Data/@keyAlt)") 
      description = nav.Evaluate("string(Description)") 

     End While 
    End If 
0

Это следует сделать это:

' A class to contain both values 
Public Class Obj 
    Public Property DataKeyAlt As String 
    Public Property Description As String 
End Class 

' A method to parse the XML and return your data 
Public Function GetData(Xml as String) as IEnumerable(Of Obj) 
    Dim doc As XDocument = XDocument.Parse(xml) 

    return From el As XElement In doc...<Message> _ 
      Where el...<Topic>[email protected] = "GLTransaction" AndAlso [email protected] = "2" _ 
      Select New Obj With { _ 
        .DataKeyAlt = el...<Data>[email protected], _ 
        .Description = el...<Description>.Value} 
End Function 
Смежные вопросы