LINQ to xml for xml-rpc
LINQ to xml for xml-rpc
我有一个 xml 如下所示:
<methodResponse>
<params>
<param>
<value>
<struct>
<member>
<name>originTransactionID</name>
<value>
<string>23915</string>
</value>
</member>
<member>
<name>responseCode</name>
<value>
<i4>0</i4>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodResponse>
我想检查是否有任何成员具有名为 responseCode 的元素,如果存在,我想选择值。
我可以这样挑:
var test = xDocument.Descendants("member").Elements("value").LastOrDefault().Value;
它的工作原理是因为我知道响应代码是成员的最后一个元素,但我不确定这是否是正确的方法。虽然 xml 是预定义的,但是还有更好的查询吗?
谢谢
您可以使用 XPath 查询:
var xPath = "/methodResponse/params/param/value/struct/member/name[text()='responseCode']/../value/i4";
var value = xDocument.XPathSelectElement(xPath).Value;
注意如何使用 name[text()='responseCode']
来选择正确的 member
元素。即使 member
元素的顺序发生变化或另一个 member
出现在最后一个元素时,这仍然有效。
是的,您是对的,因为您知道要查找的元素位于最后一个位置,因此 LastOrDefault
适用于您的情况,但它显然不是针对真实场景的动态查询.
您可以使用 FirstOrDefault
来查找整个集合中的第一个匹配元素并获取如下值:-
var test = (string)xDocument.Descendants("member")
.FirstOrDefault(x => (string)x.Element("name") == "responseCode")
?.Element("value");
我有一个 xml 如下所示:
<methodResponse>
<params>
<param>
<value>
<struct>
<member>
<name>originTransactionID</name>
<value>
<string>23915</string>
</value>
</member>
<member>
<name>responseCode</name>
<value>
<i4>0</i4>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodResponse>
我想检查是否有任何成员具有名为 responseCode 的元素,如果存在,我想选择值。
我可以这样挑:
var test = xDocument.Descendants("member").Elements("value").LastOrDefault().Value;
它的工作原理是因为我知道响应代码是成员的最后一个元素,但我不确定这是否是正确的方法。虽然 xml 是预定义的,但是还有更好的查询吗?
谢谢
您可以使用 XPath 查询:
var xPath = "/methodResponse/params/param/value/struct/member/name[text()='responseCode']/../value/i4";
var value = xDocument.XPathSelectElement(xPath).Value;
注意如何使用 name[text()='responseCode']
来选择正确的 member
元素。即使 member
元素的顺序发生变化或另一个 member
出现在最后一个元素时,这仍然有效。
是的,您是对的,因为您知道要查找的元素位于最后一个位置,因此 LastOrDefault
适用于您的情况,但它显然不是针对真实场景的动态查询.
您可以使用 FirstOrDefault
来查找整个集合中的第一个匹配元素并获取如下值:-
var test = (string)xDocument.Descendants("member")
.FirstOrDefault(x => (string)x.Element("name") == "responseCode")
?.Element("value");