C# 使用LINQ to XML按元素属性筛选文档
我有这个XML文档:C# 使用LINQ to XML按元素属性筛选文档,c#,linq-to-xml,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="N
<?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>
1.
华沙
马佐夫舍
1.
马佐夫舍
2.
斜杠
现在我只想获取属性为City的字段中没有值的行(使用LINQ to XML)。您的意思是:
var rows = from row in doc.Root.Elements("rows")
where !row.Elements("field")
.Any(x => (string) x.Attribute("name") == "City"
&& x.Value != "")
select row;
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;
也就是说,“查找所有不包含任何非空
字段元素且名称属性为城市”的行。我想这就是你想要的…你是说:
var rows = from row in doc.Root.Elements("rows")
where !row.Elements("field")
.Any(x => (string) x.Attribute("name") == "City"
&& x.Value != "")
select row;
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;
也就是说,“查找所有不包含任何非空字段元素且名称属性为城市”的行。我想这就是你想要的…类似于:
var rows = from row in doc.Root.Elements("rows")
where !row.Elements("field")
.Any(x => (string) x.Attribute("name") == "City"
&& x.Value != "")
select row;
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;
这是基于寻找没有城市值的每一行的愿望。类似于:
var rows = from row in doc.Root.Elements("rows")
where !row.Elements("field")
.Any(x => (string) x.Attribute("name") == "City"
&& x.Value != "")
select row;
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;
这是基于查找没有城市值的每一行的愿望。一旦将xml文档加载到XDocument对象中,就可以访问它的标记。因此,您应该抓住XDocument的根元素,并使用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、空字符串或空白
如果你是新手,这可能不容易理解,但我会这样做。您可以添加一些空检查,但这取决于您。将xml文档加载到XDocument对象后,您可以访问它的标记。因此,您应该抓住XDocument的根元素,并使用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、空字符串或空白
如果你是新手,这可能不容易理解,但我会这样做。您可以添加一些空检查,但现在由您决定。您的XML无效。行没有起始标记,第二个城市标记未正确关闭。您的XML无效。行没有起始标记,第二个城市标记未正确关闭。这将返回
元素,而不是
元素。根据我对OP问题的理解(这可能是错误的),他想要
元素。而且Single
如果没有正好1个元素匹配谓词,则会抛出异常。这也是正确的,但似乎字段标记、名称属性和城市属性值都存在所有标记,因此,它也可能是必需的。如果是的话,单身也不是问题。当然,您可以始终使用SingleLordDefault,但是您必须处理它返回null的选项。这将返回
元素,而不是
元素。根据我对OP问题的理解(这可能是错误的),他想要
元素。而且Single
如果没有正好1个元素匹配谓词,则会抛出异常。这也是正确的,但似乎字段标记、名称属性和城市属性值都存在所有标记,因此,它也可能是必需的。如果是的话,单身也不是问题。当然,您可以始终使用SingleLordDefault,但是您必须处理它返回null的选项。对于a,x.值将为null,而不是“”,不是吗?对于a,x.值将为null,而不是“”,不是吗?