使用LINQ to XML按元素属性过滤文档

时间:2011-02-07 15:54:48

标签: c# linq-to-xml

我有这个XML文档:

<?xml version="1.0" encoding="UTF-8"?>
<teryt>
<catalog name="TERC" type="all" date="2010-01-01">
<row>
  <field name="Woj">1</field>
  <field name="City">Warszawa</field>
  <field name="Name">Mazowsze</field>
</row>
<row>
  <field name="WojId">1</field>
  <field name="City"/>
  <field name="Name">Mazowsze</field>
</row>
<row>
  <field name="Woj">2</field>
  <field name="City"/>
  <field name="Name">Slask</field>
</row>
</catalog>
</teryt>

现在我想只获得属性为City的字段中没有值的行(使用LINQ to XML)。

3 个答案:

答案 0 :(得分:3)

你的意思是:

var rows = from row in doc.Root.Elements("rows")
           where !row.Elements("field")
                     .Any(x => (string) x.Attribute("name") == "City"
                               && x.Value != "")
           select row;

也就是说,“找到所有没有任何非空field元素且name属性为City”的行。我认为这就是你所追求的......

答案 1 :(得分:1)

类似的东西:

var query = from row in xdoc.Descendants("row")
            where row.Elements("field")
                     .Any(ff => ff.Attribute("name").Value == "City"
                             && String.IsNullOrWhitespace(ff.Value))
            select row;

这是基于希望找到没有City值的每一行。

答案 2 :(得分:1)

将xml文档加载到XDocument对象后,即可访问其标记。因此,您应该获取XDocument的Root元素,并使用Elements方法向下导航到行标记。当您在集合中拥有所有标签时,您可以将没有城市字段的标签整理出来。我几乎可以肯定xml元素上有一个HasValue属性,告诉你它是否有值。但是如果没有,可以检查Value属性是空的还是null。

现在,我喜欢这样的代码:

XDocument doc = XDocument.Load("yourfile");
var tags = doc.Root.Element("catalog")
                   .Elements("row")
                   .Where(r=>r.Elements("field")
                       .Single(f=>f.Attribute("name").Value == "City" 
                             && string.IsNullOrWhitespace(f.Value)));

它转换成这样的东西:获取文档,选择文档的根,取名为“catalog”的元素,并给我所有“row”元素,如果是,那么“row”有一个“field”元素,“name”属性设置为“City”,它是null,空字符串或空格。

如果你是新手,这可能不是那么容易理解,但这就是我要这样做的方式。您可以添加一些空检查,但现在由您决定。