使用linq vs xmlDocument从XML字符串中提取数据

Joe*_*der 6 c# xml linq

我使用xmlDocument方法完成了以下多次,但我想使用更强大的linq到xml方法.但是,我似乎碰壁了.我从twillio/crmText的restful API中获取数据.以下是他们的网站所在网站的链接:http: //crmtext.com/api/docs

这是我的XML字符串:

<response op="getcustomerinfo" status="200" message="ok" version="1.0">
  <customer>
    <totalMsg>3</totalMsg>
    <custId>9008281</custId>
    <custName></custName>
    <timestamp>2015-04-30 16:17:19</timestamp>
    <optinStatus>3</optinStatus>
    <custMobile>6185551212</custMobile>
    <subacct>1st Choice Courier</subacct>
  </customer>
</response>
Run Code Online (Sandbox Code Playgroud)

我需要找出optinStatus.它应该返回3.我使用下面的,返回上面的xml

XDocument xdoc = XDocument.Parse(result1);
Run Code Online (Sandbox Code Playgroud)

我尝试了大约4000种不同的东西,包括:

 IEnumerable<XElement> otinStatus = from el in xdoc.Elements("customer") select el;
          IEnumerable<XElement> otinStatus2 = from el in xdoc.Elements("cusotmer.optinStatus") select el;
           IEnumerable<XElement> otinStatus3 = from el in xdoc.Elements("optinStatus") select el;
Run Code Online (Sandbox Code Playgroud)

所有这些都不会返回任何结果.

请帮助,我知道这是我想念的简单事.提前谢谢你 - 乔

Sha*_*tin 6

检索元素的值

var status = xDoc
    .Descendants("optinStatus")    // get the optinStatus element
    .Single()                      // we're expecting a single result
    .Value;                        // get the XElement's value
Run Code Online (Sandbox Code Playgroud)

这是一个适合你的小提琴.你可以看到它在这里运行.输出是3.

using System;
using System.Linq;
using System.Xml;
using System.Xml.Linq;

public class Program
{
    public static void Main()
    {
        var xDoc = XDocument.Parse(xmlString);
        var status = xDoc.Descendants("optinStatus").Single();
        Console.WriteLine(status.Value);
    }

    private static string xmlString = @"

<response op=""getcustomerinfo"" status=""200"" message=""ok"" version=""1.0"">
  <customer>
    <totalMsg>3</totalMsg>
    <custId>9008281</custId>
    <custName></custName>
    <timestamp>2015-04-30 16:17:19</timestamp>
    <optinStatus>3</optinStatus>
    <custMobile>6185312349</custMobile>
    <subacct>1st Choice Courier</subacct>
  </customer>
</response> 

    ";
}
Run Code Online (Sandbox Code Playgroud)

说明

Descendents()是一个实例轴方法(或简称).它返回IEnumerable<XElement>所有匹配后代中的一个.关于结果,我们打电话Single().它是一个Linq方法,它返回序列的唯一元素.如果有多个元素,则会引发错误.我们留下了一个单一的XElement.这表示整个XML元素.因为我们只希望它的值不是整个元素,所以我们称之为Value属性.宾果,我们完成了.

更详细一点

轴有两种:

除了一个例外,axis方法返回一个类型的集合IEnumerable<T>.例外是Element(),它返回第一个匹配的子对象.这就是AmatuerDev所使用的东西,就像你的问题一样,如果你只期望一个结果,它就是一个好的,如果不是更好的方法Descendants().

检索属性值

一旦我们有了XElement,我们就可以检索它的一个属性而不是它的值.我们通过调用Attributes()方法来做到这一点.它返回匹配XAttribute.由于我们只需要属性值,因此我们称之为Value属性.瞧.

// for attribute
var response = xDoc.Descendants("response").Single();
var attr = response.Attribute("status");
Run Code Online (Sandbox Code Playgroud)

一般的做法

使用Linq to XML是一个两步过程.

  1. 调用轴方法以获得IEnumerable<T>结果.
  2. 使用Linq查询.

也可以看看

以下是一些相关的MSDN文档: