使用默认属性路径搜索LINQ XML失败
本文关键字:LINQ XML 失败 路径搜索 属性 默认 | 更新日期: 2023-09-27 18:14:53
我使用了下面的代码来搜索元素的数量,并且搜索只有在没有默认路径时搜索才成功:
搜索代码:
XElement root = XElement.Load(@"c:'b.txt", LoadOptions.PreserveWhitespace);
IEnumerable<XElement> address =
from el in root.Elements("Address")
select el;
int c = address.Count();
c的值为2,数据如下:
<?xml version="1.0" encoding="UTF-8"?>
<presence xmlns:a="urn:ietf:params:xml:ns:pidf"
xmlns:dm="urn:ietf:params:xml:ns:pidf:data-model"
xmlns:oma="urn:xml:prs:pidf:oma-pres"
entity="sip:john@police.city.gov">
<Address Type="Shipping">
<Name>Ellen Adams</Name>
<Street>123 Maple Street</Street>
<City>Mill Valley</City>
<State>CA</State>
<Zip>10999</Zip>
<Country>USA</Country>
</Address>
<Address Type="Billing">
<Name>Tai Yee</Name>
<Street>8 Oak Avenue</Street>
<City>Old Town</City>
<State>PA</State>
<Zip>95819</Zip>
<Country>USA</Country>
</Address>
</presence>
但是如果我通过将第二行交换为(xmlns而不是xmlns:a)来改变XML:
<presence xmlns="urn:ietf:params:xml:ns:pidf"
我得到的值是0,这是不正确的。
任何建议吗?
谢谢
xmlns="urn:ietf:params:xml:ns:pidf"
表示为xml中没有指定任何名称空间的所有元素设置默认名称空间。
XElement root = XElement.Load(@"c:'b.txt", LoadOptions.PreserveWhitespace);
XNamespace xmlns = "urn:ietf:params:xml:ns:pidf";
IEnumerable<XElement> address = root.Elements(xmlns + "Address");
Console.WriteLine(address.Count()); //prints 2
或者您可以使用与名称空间无关的方法,无论指定的默认名称空间是什么,它都可以工作:
var address = root.Elements()
.Where(node => node.Name.LocalName == "Address");
//address will contain the same nodes, as in previous example
还要注意,在这种情况下扩展方法的语法要干净得多。
通过设置xmlns="urn:ietf:params:xml:ns:pidf",您已经为所有元素设置了默认名称空间。因此,"Address"元素不再存在。它现在被称为"urn:ietf:params:xml:ns:pidf:Address"
您需要做的是声明一个XNamespace并将其添加到元素名称中:
XNamespace defaultNamespace = "urn:ietf:params:xml:ns:pidf";
XElement root = XElement.Load(@"c:'b.txt", LoadOptions.PreserveWhitespace);
IEnumerable<XElement> address =
from el in root.Elements(defaultNamespace + "Address")
select el;
int c = address.Count();