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");

Sample Fiddle.