C# XML到LINQ如何获取精确信息?

C# XML到LINQ如何获取精确信息?,c#,xml,linq,C#,Xml,Linq,我想从下面的xml示例中提取一些信息。我想提取包含我感兴趣的列的行集合 我真的不知道怎么做。。。我尝试了此代码,但不起作用: XElement elem = XElement.Load("SIMC.xml"); var homePhone = from phoneno in elem.Elements("row") where (string)phoneno.Element("col").Attribute("name") == "NAZW

我想从下面的xml示例中提取一些信息。我想提取包含我感兴趣的列的行集合

我真的不知道怎么做。。。我尝试了此代码,但不起作用:

    XElement elem = XElement.Load("SIMC.xml");
    var homePhone = from phoneno in elem.Elements("row")
                    where (string)phoneno.Element("col").Attribute("name") == "NAZWA"
                    select phoneno;
   // Console.WriteLine("List HomePhone Nos.");
    foreach (XElement xEle in homePhone)
    {
        MessageBox.Show(xEle.Element("col").Value);
    }
下面是我试图解析的XML示例:

<?xml version="1.0" encoding="UTF-8"?>
<teryt>
<catalog name="SIMC" type="all" date="2015-01-01">
<row>
<col name="WOJ">18</col>
<col name="POW">16</col>
<col name="GMI">13</col>
<col name="RODZ_GMI">2</col>
<col name="RM">00</col>
<col name="MZ">1</col>
<col name="NAZWA">Na Polu</col>
<col name="SYM">0664326</col>
<col name="SYMPOD">0664310</col>
<col name="STAN_NA">2015-01-01</col>
</row>
<row>
<col name="WOJ">28</col>
<col name="POW">06</col>
<col name="GMI">05</col>
<col name="RODZ_GMI">2</col>
<col name="RM">03</col>
<col name="MZ">1</col>
<col name="NAZWA">Majerka</col>
<col name="SYM">0761615</col>
<col name="SYMPOD">0761609</col>
<col name="STAN_NA">2015-01-01</col>
</row>
<row>
<col name="WOJ">12</col>
<col name="POW">09</col>
<col name="GMI">03</col>
<col name="RODZ_GMI">5</col>
<col name="RM">00</col>
<col name="MZ">1</col>
<col name="NAZWA">Pod Kamiennikiem</col>
<col name="SYM">0328485</col>
<col name="SYMPOD">0328456</col>
<col name="STAN_NA">2015-01-01</col>
</row>
<row>
<col name="WOJ">32</col>
<col name="POW">17</col>
<col name="GMI">04</col>
<col name="RODZ_GMI">5</col>
<col name="RM">01</col>
<col name="MZ">1</col>
<col name="NAZWA">Miłogoszcz</col>
<col name="SYM">0530732</col>
<col name="SYMPOD">0530732</col>
<col name="STAN_NA">2015-01-01</col>
</row>

18
16
13
2.
00
1.
纳波鲁
0664326
0664310
2015-01-01
28
06
05
2.
03
1.
马杰卡
0761615
0761609
2015-01-01
12
09
03
5.
00
1.
卡米恩尼基姆酒店
0328485
0328456
2015-01-01
32
17
04
5.
01
1.
米奥戈兹茨
0530732
0530732
2015-01-01
我想在属性
name
等于
NAZWA
且列值
Miłogoszcz
的列中提取行元素


我的代码目前没有显示任何内容

您需要使用
子代
或者正确地遍历XML层次结构,您的逻辑跳过了两个级别。我还将
(字符串)
更改为
.Value
以正确工作

XElement elem = XElement.Load("SIMC.xml");
var homePhone = from phoneno in elem.Elements("teryt")
                                    .Elements("catalog")
                                    .Elements("row")
                where phoneno.Elements("col")
                             .Any(xelm =>
                                      xelm.Attribute("name").Value == "NAZWA" &&
                                      xelm.Value == "Miłogoszcz")
                select phoneno;
// Console.WriteLine("List HomePhone Nos.");
foreach (XElement xEle in homePhone)
{
    //Note that you need to decide how to format this
    MessageBox.Show(string.Join(", ",
                    xEle.Select(x => x.Attribute("name").Value + "=" + x.Value));
}

如果我们直观地思考这个问题,我们真正想要的是:

返回行,其中该行中的任何列具有具有特定值的属性“name”和具有特定值的列值

假设我们已经得到了表示XML文件行元素的
IEnumerable行
。然后,我们可以使用LINQ的扩展方法只选择我们关心的行。下面是这样一个函数的样子

    public static IEnumerable<XElement> GetRowsWithColumn(IEnumerable<XElement> rows, String name, String value) 
    {
        return rows
            .Where(row => row.Elements("col") //Get Columns
                .Any(col => //This column should...
                    col.Attributes("name").Any(attr => attr.Value.Equals(name)) //have the right name attribute
                    && col.Value.Equals(value))); //and have the right value
    }
我希望这能解决你的问题。如果我遗漏了什么,请告诉我

请注意,我确实通过包含顶级元素的结束块将您的XML文件更改为有效

<?xml version="1.0" encoding="UTF-8"?>
<teryt>
<catalog name="SIMC" type="all" date="2015-01-01">
<row>
<col name="WOJ">18</col>
<col name="POW">16</col>
<col name="GMI">13</col>
<col name="RODZ_GMI">2</col>
<col name="RM">00</col>
<col name="MZ">1</col>
<col name="NAZWA">Na Polu</col>
<col name="SYM">0664326</col>
<col name="SYMPOD">0664310</col>
<col name="STAN_NA">2015-01-01</col>
</row>
<row>
<col name="WOJ">28</col>
<col name="POW">06</col>
<col name="GMI">05</col>
<col name="RODZ_GMI">2</col>
<col name="RM">03</col>
<col name="MZ">1</col>
<col name="NAZWA">Majerka</col>
<col name="SYM">0761615</col>
<col name="SYMPOD">0761609</col>
<col name="STAN_NA">2015-01-01</col>
</row>
<row>
<col name="WOJ">12</col>
<col name="POW">09</col>
<col name="GMI">03</col>
<col name="RODZ_GMI">5</col>
<col name="RM">00</col>
<col name="MZ">1</col>
<col name="NAZWA">Pod Kamiennikiem</col>
<col name="SYM">0328485</col>
<col name="SYMPOD">0328456</col>
<col name="STAN_NA">2015-01-01</col>
</row>
<row>
<col name="WOJ">32</col>
<col name="POW">17</col>
<col name="GMI">04</col>
<col name="RODZ_GMI">5</col>
<col name="RM">01</col>
<col name="MZ">1</col>
<col name="NAZWA">Miłogoszcz</col>
<col name="SYM">0530732</col>
<col name="SYMPOD">0530732</col>
<col name="STAN_NA">2015-01-01</col>
</row>
</catalog>
</teryt>

18
16
13
2.
00
1.
纳波鲁
0664326
0664310
2015-01-01
28
06
05
2.
03
1.
马杰卡
0761615
0761609
2015-01-01
12
09
03
5.
00
1.
卡米恩尼基姆酒店
0328485
0328456
2015-01-01
32
17
04
5.
01
1.
米奥戈兹茨
0530732
0530732
2015-01-01

请不要使用指向外部来源的链接来支持您的问题。它们可能(而且经常)过时或完全丢失,使问题本身对未来的读者毫无用处。请在您的问题中提供一个XML格式的简短示例,以便问题完全独立。此外,请比“它没有工作”更具体一些。清楚地解释您尝试使用的代码是什么,以及它与您期望或想要的代码有何不同。我应该将确切的nazwa(如“Na Polu”)放置在哪里,以获取有关包含“Na Polu”的行的信息?谢谢你的帮助;)@PiotrBagier:更新了,请注意,“显示整行”是另一个问题,因为您没有详细说明您希望它的外观,所以我现在只是以原始形式输出原始的
。我将其解析为字符串,但结果仍然无法获得包含以下信息的messagebox:(@PiotrBagier:我添加了一个示例,但老实说,您可能希望跳过消息框步骤,而是查看您想要的最终结果。如果您需要确保选择了正确的元素,那么只需使用调试器即可。
<?xml version="1.0" encoding="UTF-8"?>
<teryt>
<catalog name="SIMC" type="all" date="2015-01-01">
<row>
<col name="WOJ">18</col>
<col name="POW">16</col>
<col name="GMI">13</col>
<col name="RODZ_GMI">2</col>
<col name="RM">00</col>
<col name="MZ">1</col>
<col name="NAZWA">Na Polu</col>
<col name="SYM">0664326</col>
<col name="SYMPOD">0664310</col>
<col name="STAN_NA">2015-01-01</col>
</row>
<row>
<col name="WOJ">28</col>
<col name="POW">06</col>
<col name="GMI">05</col>
<col name="RODZ_GMI">2</col>
<col name="RM">03</col>
<col name="MZ">1</col>
<col name="NAZWA">Majerka</col>
<col name="SYM">0761615</col>
<col name="SYMPOD">0761609</col>
<col name="STAN_NA">2015-01-01</col>
</row>
<row>
<col name="WOJ">12</col>
<col name="POW">09</col>
<col name="GMI">03</col>
<col name="RODZ_GMI">5</col>
<col name="RM">00</col>
<col name="MZ">1</col>
<col name="NAZWA">Pod Kamiennikiem</col>
<col name="SYM">0328485</col>
<col name="SYMPOD">0328456</col>
<col name="STAN_NA">2015-01-01</col>
</row>
<row>
<col name="WOJ">32</col>
<col name="POW">17</col>
<col name="GMI">04</col>
<col name="RODZ_GMI">5</col>
<col name="RM">01</col>
<col name="MZ">1</col>
<col name="NAZWA">Miłogoszcz</col>
<col name="SYM">0530732</col>
<col name="SYMPOD">0530732</col>
<col name="STAN_NA">2015-01-01</col>
</row>
</catalog>
</teryt>