我有一个xml文件,它返回一组元素,这些元素的属性值是唯一的。这就带来了一个问题,因为我不能通过名称选择节点:
<doc>
<float name="score">1.2873721</float>
<arr name="2_category">
<long>3021</long>
</arr>
<arr name="ATR_FamilyName">
<str>Some Cookbook </str>
</arr>
<arr name="ATR_IsFamily">
<str>0</str>
</arr>
<arr name="ATR_SellPrice">
<str>49.95</str>
</arr>
<arr name="ATR_VendorId">
<str>ABC</str>
</arr>
<arr name="ATR_VendorName">
<str>WROX</str>
</arr>
</doc>
我使用linq来填充一个“Product”类。我可以通过位置来选择元素,但是如果节点不存在,这就成了一个问题。有没有一种方法可以根据节点的属性值来选择节点?在下面的例子中,如果@name属性=“ATR_FamilyName”,我可以得到arr节点吗?在xpath中,它应该是:
doc/arr[@name = 'ATR_FamilyName']/str
下面是我的链接到XML查询:
var query = from rt in results
where (String)rt.Descendants().ElementAt(5).Element("str").Value == "0"
select new Product.Product
{
FamilyName = (String)rt.Descendants().ElementAt(3).Value
// doc/arr[@name = 'ATR_FamilyName']/str - select Family Name is arr/@name 'ATR_FamilyName'
MorePropertiestoset....
};
3条答案
按热度按时间aydmsdu91#
类似于AS-CII的答案,但不使用查询表达式(外部表达式除外),并且强制转换为
XAttribute
,并在匿名类型中选择str
元素值:请注意,对
Attribute("name")
调用的结果使用强制转换意味着,如果存在 * 不 * 具有该属性的任何元素,则强制转换将导致空引用如果使用Value
属性,你会得到一个例外。有时候例外可能更好-如果这表明数据从根本上被破坏了,并且您希望了解它,而不仅仅是与值不匹配。(The对于
XElement
到string
的转换也是如此。)soat7uwm2#
使用LINQ,您可以轻松地只选择具有指定属性的节点,如下所示:
k3fezbri3#
XElement
的用法如下:抱歉用手机打字