使用Linq查找基于ID的特定XML元素

时间:2009-10-20 10:23:01

标签: xml linq

我想根据标准找到xml的一部分,所以我使用linq to XML。不幸的是结果总是为空,所以我猜我做错了。下面显示的是我正在解析的XML的示例。

<Stuff>
 <ItemsA />
 <ItemsB />
 <ItemsC>
  <Item xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Stuff">
   <Id>4bd7b5ac-cb29-4d34-97be-deaebe4a5186</Id>
   <Children>
    <Item>
      <Id>22e3ef6b-4321-40c3-9237-196ba527e9ad </Id>
      <Name>SomeName</Name>
    </Item>
   </Children>
  <Description>SomeText</Description>
  <Name>NewName</Name>
</Item>    

我正在查看“ItemsC”部分,其中可能有多个“Item”XML块(本例中只显示了一个)。我想基于它的“Id”检索元素,在上面的例子中ID为“4bd7b5ac-cb29-4d34-97be-deaebe4a5186”。

我使用的代码如下所示:

XElement data = XElement.Parse(GetFile());

  var pbp = (from b in data.Descendants("Item")
             where b.Element("Id").Value == "4bd7b5ac-cb29-4d34-97be-deaebe4a5186"
             select b.Element("Id").Parent).FirstOrDefault();

pbp始终返回null。任何人都可以帮我生成正确的linq表达式。

2 个答案:

答案 0 :(得分:0)

是的 - 你只是错过了命名空间:

string desiredId = "4bd7b5ac-cb29-4d34-97be-deaebe4a5186";
XNamespace ns = "http://schemas.datacontract.org/2004/07/Stuff";
var pbp = (from b in data.Descendants(ns + "Item")
           where b.Element(ns + "Id").Value == desiredId
           select b).FirstOrDefault();

请注意,我将b.Element("Id").Parent简化为b - 如果您只是在树下然后再往上,那么您可能会保持原状:)

这表明使用点符号的进一步简化:

string desiredId = "4bd7b5ac-cb29-4d34-97be-deaebe4a5186";
XNamespace ns = "http://schemas.datacontract.org/2004/07/Stuff";
var pbp = data.Descendants(ns + "Item")
              .Where(b => b.Element(ns + "Id").Value == desiredId)
              .FirstOrDefault();

如果该元素有可能没有“Id”元素,那么您可以转换为字符串:

string desiredId = "4bd7b5ac-cb29-4d34-97be-deaebe4a5186";
XNamespace ns = "http://schemas.datacontract.org/2004/07/Stuff";
var pbp = data.Descendants(ns + "Item")
              .Where(b => (string) b.Element(ns + "Id") == desiredId)
              .FirstOrDefault();

这可以避免可能的NullReferenceException。

答案 1 :(得分:0)

您只需要将命名空间添加到查询中,即

XNamespace ns = "http://schemas.datacontract.org/2004/07/Stuff";

var pbp =
   (from b in data.Descendants(ns + "Item")
   where b.Element(ns + "Id").Value == "4bd7b5ac-cb29-4d34-97be-deaebe4a5186"
   select b.Element(ns + "Id").Parent).FirstOrDefault();
相关问题