Xml 如何为特定值解析多个元素

Xml 如何为特定值解析多个元素,xml,vb.net,xmldocument,Xml,Vb.net,Xmldocument,我从一个web服务接收到一个XML字符串,并对其进行解析以获取一些需要保存的值。我将字符串放入一个XmlDocument中,并使用XmlNodeReader解析元素名并获取值 如果命名了我后面的值,例如此代码段中的类型、ID或源,则这一点很好: <WebResult> <Header> <Type>Success</Type> <ID>52347</ID> </Header>

我从一个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>

成功
52347
全球的
萨利德
CO12345
产品ID
XY000001
但是,在本例中,我不确定获取SalesID的“DataValue”值CO12345的最佳方法。(XML模式要大得多)

我可以解析SaleID+x字符的字符串,但是如果web服务发生变化,并且我依赖于字符串位置,那么这个字符串就会中断。我宁愿不必序列化到类中,因为似乎应该有一种简单的方法来实现这一点。(我不知道!)

如果你能够(或愿意)使用它,这很容易

”XDocument.Parse将从字符串加载XML
'使用XDocument.Load从文件中加载它
Dim xDoc As XDocument=XDocument.Parse(xmlString)
Dim salesID=(从xDoc.subjects(“ReturnItem”)中的x开始)
其中x.Element(“DataName”).Value=“SaleID”
选择x.Element(“DataValue”).Value.FirstOrDefault()
上面的代码片段首先获取
xDoc
中的所有“ReturnItem”元素(及其子元素)

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

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

FirstOrDefault
返回匹配的第一个元素(如果未找到任何内容,则返回默认值)。如果没有
FirstOrDefault()
,您将获得一组匹配结果,然后可以对这些结果进行迭代

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

编辑以添加非LINQ方法

以下是使用和执行上述操作的方法:

Dim xmlDoc作为新的XmlDocument()
'使用LoadXML从字符串加载;如果来自文件,请使用加载
LoadXml(xmlString)
作为字符串的Dim SaleID
将ReturnItems设置为XmlNodeList=xmlDoc.SelectNodes(“/WebResult/ReturnItems/ReturnItem”)
作为ReturnItems中的XmlNode的每个项目
如果Item.SelectSingleNode(“DataName”).InnerText=“SaleID”,则
SaleID=Item.SelectSingleNode(“DataValue”).InnerText
如果结束
下一个
上面的代码片段将XML字符串加载到
XmlDocument
中。然后,它选择与XPath表达式“/WebResult/ReturnItems/ReturnItem”匹配的所有节点(即,它获取所有ReturnItem节点及其子节点)

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

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

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


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

我已经编辑了您的标题。请看“”,其中的共识是“不,他们不应该”。谢谢蒂姆。Linq肯定是一条路要走,但由于我们无法控制的原因,我们在这个项目中只能使用NETFramework2.0。(框架与Linq不兼容,没有一些漏洞。)@SSJON-看看
XmlDocument
和XPath查询。我在上面贴了一个简单的例子来给你一个基本的想法。