0

我正在从 Web 服务接收一串 XML 并对其进行解析以获取一些我需要保存的值。我将字符串放入 XmlDocument 并使用 XmlNodeReader 解析元素名称并获取值。

当我所追求的值被命名时,这很好,例如此片段中的类型、ID 或源:

<WebResult>
    <Header>
      <Type>Success</Type>
      <ID>52347</ID>
    </Header>
  <Source>Global</Source>
   <ReturnItems>
    <ReturnItem>
      <DataName>SaleID</DataName>
      <DataValue>CO12345</DataValue>
    </ReturnItem>
    <ReturnItem>
      <DataName>ProductID</DataName>
      <DataValue>XY000001</DataValue>
    </ReturnItem>
  </ReturnItems>
</WebResult>

但是,我不确定在此示例中获取 SalesID 的 CO12345 的“DataValue”值的最佳方法。(XML 模式要大得多)

我可以解析 SaleID + x 字符的字符串,但是如果 Web 服务发生更改并且我依赖字符串位置,那将会中断。我宁愿不必序列化成一个类,因为似乎应该有一种简单的方法来做到这一点。(我错过了!)

4

1 回答 1

1

如果您能够(或愿意)使用它,使用LINQ to XML非常容易。

' XDocument.Parse will load XML from a string
' Use XDocument.Load to load it from a file
Dim xDoc As XDocument = XDocument.Parse(xmlString)

Dim salesID = (From x In xDoc.Descendants("ReturnItem")
              Where x.Element("DataName").Value = "SaleID"
              Select x.Element("DataValue").Value).FirstOrDefault() 

上面的代码片段首先在xDoc.

接下来,它在以 SalesID 作为值的“DataName”元素上对其进行过滤。

然后它选择相应的“DataValue”元素的值。

FirstOrDefault返回匹配的第一个元素(如果没有找到,则返回默认值)。没有FirstOrDefault()您将获得一组匹配的结果,然后您可以遍历这些结果。

上面是一个非常简单的例子,但是 LINQ to XML 非常强大,在处理 XML 时我更喜欢它。

编辑添加非 LINQ 方法

XmlDocument这是使用和XPath 语法执行上述操作的方法:

Dim xmlDoc As New XmlDocument()
' Use LoadXML to load from a string; if from a file use Load
xmlDoc.LoadXml(xmlString)

Dim SaleID As String

Dim ReturnItems As XmlNodeList = xmlDoc.SelectNodes("/WebResult/ReturnItems/ReturnItem")

For Each Item As XmlNode In ReturnItems
    If Item.SelectSingleNode("DataName").InnerText = "SaleID" Then
        SaleID = Item.SelectSingleNode("DataValue").InnerText
    End If
Next

上面的代码片段将 XML 字符串加载到XmlDocument. 然后,它选择与 XPath 表达式“/WebResult/ReturnItems/ReturnItem”匹配的所有节点(即,它获取所有 ReturnItem 节点及其子节点)。

接下来,它遍历集合,并且对于每个 ReturnItem 节点,它检查 DataName 节点是否等于“SaleID”,如果是,则将 DataValue 节点的值分配给SaleID字符串。

这又是一个微不足道的例子。如果您在 XML 中有多个“SaleID”节点,则需要将值放在列表或其他集合中,否则上面的代码只会给您最后一个。

XPath 非常强大,并且对 XML 和 XPath 的丰富支持自 1.0 以来一直是 .NET Framework 的一部分。

这里的好处是,如果消息的格式发生变化,您只需要更新 XPath 查询,而不是弄清楚如何解析新格式。

于 2013-05-13T03:06:10.610 回答