解析Amzon API * .xml响应

时间:2015-01-04 12:28:50

标签: .net xml vb.net parsing amazon

我试图解析来自amazon api的xml-response。

这是收到的xml文件的一部分:

<BrowseNodeLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01">
  <OperationRequest>
    <RequestId>31317fca-ad3d-4ff0-a64f-693c0e44959b</RequestId>
    <Arguments>
      <Argument Name="Operation" Value="BrowseNodeLookup" />
      <Argument Name="Service" Value="AWSECommerceService" />
      <Argument Name="Version" Value="2011-08-01" />
      <Argument Name="BrowseNodeId" Value="186606" />
      <Argument Name="Timestamp" Value="2015-01-04T11:50:06Z" />
      <Argument Name="ResponseGroup" Value="BrowseNodeInfo" />
    </Arguments>
    <RequestProcessingTime>0.002221</RequestProcessingTime>
  </OperationRequest>
  <BrowseNodes>

我想阅读Argument Timestamp。这是我的代码,但它只有在我删除xml文件中的xmlns属性时才有效。

    Dim nodeTimestamp As XmlNode = doc.SelectSingleNode("/BrowseNodeLookupResponse/OperationRequest/Arguments/Argument[@Name='Timestamp']")

    Dim text As String = nodeTimestamp.Attributes.ItemOf("Value").InnerText

1 个答案:

答案 0 :(得分:0)

我想你从amazon收到了一个有效的XML(最后一个结束标记为</BrowseNodeLookupResponse>。你可以使用LINQ2XML来选择所需值属性的值。你需要采用默认值名称空间,并在访问和搜索XML中的特定元素/节点时使用它。例如,我已将XML输入保存在名为axml.xml的文件中:

' load the xml. Use XDocument.Parse to load a XML-Structure from a String!
Dim xml as XDocument = XDocument.Load("c:\temp\axml.xml")
' get the namespace for later use
Dim ns = xml.Root.GetDefaultNamespace()
' find the Arguments node, holding all Argument nodes. Note the use of the namespace
Dim arguments = xml.Root _
    .Descendants(ns + "Arguments") _ 
    .Elements(ns + "Argument")
' find and take the Argument node with the specified name
Dim ts = from argument in arguments
         where argument.Attribute("Name").Value = "Timestamp"
         select argument
' take the value of the desired attribute
Console.WriteLine(ts.FirstOrDefault().Attribute("Value").Value)

输出结果为:

2015-01-04T11:50:06Z

如果您想坚持使用XmlDocument方法,则需要使用XmlDocumentNamespaceManager (as shown in this SO post)以使用命名空间检索节点。解决方案可能如下所示:

Dim xml = new XmlDocument()
xml.Load("c:\temp\axml.xml")
Dim xmlnsManager = new XmlNamespaceManager(xml.NameTable)
' take the custom namespace and add it to the namespace manager
xmlnsManager.AddNamespace("custom", xml.ChildNodes(0).Attributes("xmlns").Value)
' find the desired node
Dim nodeTimestamp = xml.SelectSingleNode("//custom:Arguments/custom:Argument[@Name='Timestamp']", xmlnsManager)
' and take the attribute value
Console.WriteLine(nodeTimestamp.Attributes("Value").Value)

输出与上述相同。