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