我正在模拟将返回XElement的Web服务。该服务从数据库生成其XElement。为了获得本地测试服务,我创建了一个模拟XML元素列表的XML文档。我希望通过LINQ to XML选择并返回其中一个。
所以我有一个XML文档:
<?xml version="1.0" encoding="utf-8" ?>
<customers>
<customer ordercode="GCT/12345A">
<title>Miss</title>
<initials>A</initials>
<surname>Customer</surname>
...
</customer>
<customer ordercode="GCT/12346A">
<title>Mrs</title>
<initials>AN</initials>
<surname>Other</surname>
...
</customer>
</customers>
使用LINQ我想通过ordercode属性选择一个Customer元素。我只需要基本浏览客户节点的InnerXML并返回它。我尝试解析:
XElement xcust = (XElement)(from c in xdocument.Descendants("customer")
where c.Attribute("ordercode") == strorder
return c).Single();
但它不起作用。我也尝试过:
return new XElement("customer", [same LINQ Query]);
我猜我需要以某种方式询问所选客户的InnerXML的查询,但我不知道该怎么做。因为大多数人只是将XML直接解析为所需的对象(因为我正在模拟来自远程服务的响应,我无法做到),所以我只能返回原始元素时找不到太多信息,因为我猜这是一个边缘案例用法。
答案 0 :(得分:5)
您需要检查属性的Value属性:
XElement xcust = (XElement)(from c in doc.Descendants("customer")
where c.Attribute("ordercode").Value == strorder
select c).Single();
您也可以省略对XElement的强制转换。
答案 1 :(得分:0)
当然,我是愚蠢的:
where c.Attribute("ordercode") == strorder
应该是:
where c.Attribute("ordercode").Value.ToString() == strorder.
然后它不会跳过它。
答案 2 :(得分:0)
尝试:
var res = (from c in xdocument.Element("customers").Elements()
let attr = c.Attribute("ordercode")
where attr != null && attr.Value == strorder
select c).Single();