解决 如何解析通用XML信封并获取所有节点值(内部文本)分开(未串联)

Whiteadi

成员
已加入
2020年11月19日
留言内容
9
编程经验
10+
我想解析任何SOAP响应XML,通常是如果我有一个带有响应strXML的字符串xml,我可以这样做:


C#:
XmlDocument doc = new XmlDocument();

doc.LoadXml(strXML);

String str = doc.InnerText;

return str;

我会得到所有节点的值,文本,但是 级联的.

我想以一种通用的方式来解析SOAP响应。

例如,如果我有这个响应信封:

XML:
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:hy="http://www.herongyang.com/Service/">

<soapenv:Header/>

<soapenv:Body>

<hy:GetExchangeRateResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

<ratePart xsi:type="xsd:decimal">123.14</ratePart>

</hy:GetExchangeRateResponse>

</soapenv:Body>

</soapenv:Envelope>

上面的c#代码将为我返回这个信封一个不错的值,但是如果hy:GetExchangeRateResponse有一个额外的子节点,可以说:


<ratePart1 xsi:type="xsd:decimal">123.14</ratePart1>

<ratePart2 xsi:type="xsd:decimal">234.14</ratePart2>


那么我会得到: 123.14234.14 串联起来,我想要类似123.14、234.14 ...

PS:通常与我一起使用的服务返回一个值,所以是的,尽管这是一种简单的方法,但是当有多个节点/文本时却没有。
 
Solution
我还建议您从XmlDocument迁移到XDocument / Linq。本示例将后代文本节点选择为字符串的IEnumerable:
C#:
var doc = XDocument.Parse(xml);
var texts = from node in doc.DescendantNodes().OfType<XText>() select node.Value;

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,049
地点
挪威
编程经验
10+
我还建议您从XmlDocument迁移到XDocument / Linq。本示例将后代文本节点选择为字符串的IEnumerable:
C#:
var doc = XDocument.Parse(xml);
var texts = from node in doc.DescendantNodes().OfType<XText>() select node.Value;
 
解决方案
最佳 底部