Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ to XML按元素属性筛选文档_C#_Linq To Xml - Fatal编程技术网

C# 使用LINQ to 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文档:

<?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,而不是“”,不是吗?