首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从XPathDocument获取特定节点

从XPathDocument获取特定节点
EN

Stack Overflow用户
提问于 2013-04-10 15:16:49
回答 3查看 2.5K关注 0票数 1

所以,

我有一个从POST请求中得到的XPathDocument,它基本上是这样的:

代码语言:javascript
复制
<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>

这是太多的信息,因为我只需要以下内容:对于每个消息( Topic node="GLTransaction"Message type=2 ),我需要Data KeyAltDescriptionE 210

编程语言是VB.NET。

多谢各位!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-10 15:55:51

选择适当的XPath元素需要使用的Message是:

代码语言:javascript
复制
//Message[(Topic/@node='GLTransaction') and (@type='2')]

例如:

代码语言:javascript
复制
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

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2013-04-10 15:57:02

我想出了,类型和节点的筛选可以通过一个简单的if语句来完成:

代码语言:javascript
复制
    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
EN

Stack Overflow用户

发布于 2013-04-10 15:57:33

这应该可以做到:

代码语言:javascript
复制
' 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>.First.@node = "GLTransaction" AndAlso el.@type = "2" _
           Select New Obj With { _
                   .DataKeyAlt = el...<Data>.@keyAlt, _
                   .Description = el...<Description>.Value}
End Function
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15929878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档