2012-02-07 55 views
0

基本上我有,看起來像這樣的XML文件:XPath的幫助,創建XPathNodeIterator確切

<?xml version="1.0" encoding="UTF-8"?> 
<data> 
<sender sndid="FT"> 
    <val n="name">Oy Finntack Ltd</val> 
    <val n="address1">Keskikankaantie 29-31</val> 
    <val n="zipcode">15860</val> 
    <val n="city">Hollola</val> 
    <val n="country">FI</val> 
    <partner parid="POSTI"> 
     <val n="iban">FI2515193000110201</val> 
     <val n="bic">NDEAFIHH</val> 
     <val n="postgiro">15193000110201</val> 
     <val n="custno">632368</val> 
    </partner> 
</sender> 
<receiver rcvid="109480"> 
    <val n="name">Petra Kern</val> 
    <val n="address1">Ziegelgasse 14</val> 
    <val n="zipcode">73525</val> 
    <val n="city">Schwabisch Gmund</val> 
    <val n="country">DE</val> 
</receiver> 
<shipment orderno="635023"> 
    <val n="reference"/> 
    <val n="from">FT</val> 
    <val n="to">109480</val> 
    <service srvid="IT14"> 
     <addon adnid="mprc"/> 
     <val n="returnlabel">no</val> 
    </service> 
    <container measure="parcel" type="parcel"> 
     <val n="reference">PCK00000160</val> 
     <val n="copies">1</val> 
     <val n="weight">0.3</val> 
     <val n="contents"/> 
     <val n="packagecode">pc</val> 
     <val n="marking">horze-finntack</val> 
    </container> 
</shipment> 

我寫一個Windows服務,在給定的時間間隔檢查XML文件的文件夾,這些數據隨後通過專有方法發送,以便進行評估,發貨和跟蹤,然後逐個解析它們以獲取某些特定信息(以解決地址和發貨內容)。所有這些代碼工作正常,我的問題是在VB .Net中訪問XML(我是一名PHP程序員,如果這是一個Web應用程序,可以在10分鐘內完成)。無論如何,這裏是一些代碼。這個Sub搜索PathExt結尾的所有文件,然後對於找到的每個文件將從XML文件中獲取某些信息並將其發送進行處理。

Sub GetXMLFiles() 
    //declare some variables 
    Dim fName As String 
    Dim Files = New ArrayList 
    Dim I As Integer = 1 
    Dim dirInfo As New DirectoryInfo(Path) 
    Dim fileInfos() As FileInfo = dirInfo.GetFiles(Ext) 
    For Each file_info As FileInfo In fileInfos 
     fName = file_info.FullName 
     Try 
      Dim xDoc As XPathDocument = New XPathDocument(fName) 
      Dim xNav As XPathNavigator = xDoc.CreateNavigator() 

      //from here until the end of this Try statement is just a test. 
      Dim sender As XPathNodeIterator 
      sender = xNav.Select("/data/sender") 
      While (sender.MoveNext()) 
       Console.WriteLine(sender.Current.Value) 
      End While 
      //end test 

     Catch ex As Exception 

     End Try 
     Files.Add(Path & fName) 
    Next file_info 

End Sub 

在端,這將是有螺紋的,作爲XML結果將通過REST,它需要處理每個請求是不確定的時間被髮送。

所以這裏是我的問題/問題。在創建導航器之後,我可以像測試中一樣使用XPath表達式來選擇某個節點。但是在選擇該節點後,我無法通過名稱訪問其子節點。如果您注意到XML的<sender>元素的屬性沒有正確命名,它們是<val n="name">我需要返回的是每個<val>,它是<sender>的直接子元素(<partner>部分爲我的目的省略)。這同樣適用於<receiver>元素。 <shipment>元素可能包含多個<container>元素,但我可以處理一次,我可以找出如何正確地返回所有內容。我在<sender>中的每個<val>需要的是n="[NAME]"和實際值<val>

如果您所提供的XML的<sender>塊先看<val>我想一個有兩個變量NameValue,對於第一個例子是nameOy FinnTack Ltd

我知道我很接近!很抱歉,這篇文章很長,但我試圖回答很多關於stackoverflow的問題,這些人對他們正在做的事情非常模糊。

回答

1

你幾乎在正確的軌道上。你想用XPathNavigator.SelectChildren來實現:

public virtual XPathNodeIterator SelectChildren(
    string name, 
    string namespaceURI 
) 

我裝了示例XML文件,並使用下面的代碼處理它:

Option Infer On 
Option Explicit On 
Option Strict On 

Imports System.Xml 
Imports System.Xml.XPath 

Module Module1 

    Sub Main() 
     ParseXml("Test.xml") 
     Console.ReadLine() 
    End Sub 

    Public Sub ParseXml(ByVal fn As String) 
     Dim xd = New XPathDocument(fn) 
     Dim xn = xd.CreateNavigator() 

     Dim sender = xn.SelectSingleNode("/data/sender").SelectChildren("val", String.Empty) 
     While (sender.MoveNext()) 
      Console.WriteLine("Name: {0}, Value: {1}", sender.Current.GetAttribute("n", String.Empty), sender.Current.Value) 
     End While 
    End Sub 

End Module 

輸出如下:

Name: name, Value: Oy Finntack Ltd 
Name: address1, Value: Keskikankaantie 29-31 
Name: zipcode, Value: 15860 
Name: city, Value: Hollola 
Name: country, Value: FI 
+0

謝謝,我弄明白了(最後有點不同,我不知道關於Console.WriteLine的RegEx樣式解析,但我確實使用了GetAttribute(「n」,「」)來獲取n屬性。Str ing.Empty雖然更好,謝謝!現在我唯一的問題是像一個關聯數組一樣處理集合......但這是另一個故事,謝謝! – 2012-02-07 17:07:20

+0

如果您正在使用「集合」,但需要關聯數組的功能,是否嘗試過「Dictionary」? – LiquidPony 2012-02-07 17:28:03