2012-02-07 95 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