我使用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;
所有这些都不会返回任何结果。
请帮助,我知道这是我想念的简单事。 提前谢谢你 - 乔
答案 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
属性。宾果,我们已经完成了。
轴有两种:
XElement
,XDocument
和XNode
类的可调用成员。有一个例外,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是一个两步过程。
IEnumerable<T>
结果。以下是一些相关的MSDN文档:
答案 1 :(得分:3)
假设xDoc是XDocument。你试过..
var customer = xDoc.Root.Element("customer");
var optinStatus = customer.Element("optinStatus");
var optinStatusValue = optinStatus.Value;