我有这个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)。
答案 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,空字符串或空格。
如果你是新手,这可能不是那么容易理解,但这就是我要这样做的方式。您可以添加一些空检查,但现在由您决定。