我试图解析来自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
答案 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)
输出与上述相同。