我想根据标准找到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表达式。
答案 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();