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

时间:2015-05-13 02:21:15

标签: 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>

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

XDocument xdoc = XDocument.Parse(result1);

我尝试了大约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;

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

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

2 个答案:

答案 0 :(得分:6)

检索元素的值

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

实施例

这是一个适合你的小提琴。 You can see it running live here。输出为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> 

    ";
}

解释

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

一般方法

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

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

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

答案 1 :(得分:3)

假设xDoc是XDocument。你试过..

  var customer = xDoc.Root.Element("customer");
  var optinStatus = customer.Element("optinStatus");
  var optinStatusValue = optinStatus.Value;