gpt4 book ai didi

c# - 使用默认属性路径的 LINQ XML 搜索失败

转载 作者:数据小太阳 更新时间:2023-10-29 02:50:01 25 4
gpt4 key购买 nike

我用下面的代码来搜索元素个数,如果没有默认路径,搜索成功:

要搜索的代码:

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 中没有指定任何 namespace 的所有元素设置默认 namespace 。

因此,您还应该将命名空间声明添加到 LINQ to 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

另请注意,在这种情况下,扩展方法语法要简洁得多。

关于c# - 使用默认属性路径的 LINQ XML 搜索失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16688940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com