C# LINQ XML搜索失败,默认属性路径为

C# LINQ XML搜索失败,默认属性路径为,c#,xml,linq,C#,Xml,Linq,我使用下面的代码搜索元素的数量,搜索只有在没有默认路径的情况下才成功: 要搜索的代码: XElement root = XElement.Load(@"c:\b.txt", LoadOptions.PreserveWhitespace); IEnumerable<XElement> address = from el in root.Elements("Address") select el; int c = address.Co

我使用下面的代码搜索元素的数量,搜索只有在没有默认路径的情况下才成功:

要搜索的代码:

XElement root = XElement.Load(@"c:\b.txt", LoadOptions.PreserveWhitespace);
IEnumerable<XElement> address =
             from el in root.Elements("Address")
              select el;
int c = address.Count();
XElement root=XElement.Load(@“c:\b.txt”,LoadOptions.PreserveWhitespace);
IEnumerable地址=
从根元素中的el(“地址”)
选择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>

艾伦·亚当斯
枫树街123号
米尔山谷
加利福尼亚州
10999
美国
大仪
橡树大道8号
老城
帕
95819
美国
但是如果我通过将第二行替换为(xmlns而不是xmlns:a)来更改XML:

xmlns=“urn:ietf:params:xml:ns:pidf”
表示为xml中未指定任何命名空间的所有元素设置默认命名空间

因此,您还应该向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
还请注意,在这种情况下,扩展方法语法要干净得多。

通过设置xmlns=“urn:ietf:params:xml:ns:pidf”,您已经为所有元素设置了默认名称空间。因此,“地址”元素不再存在。它现在被称为“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();
XNamespace-defaultNamespace=“urn:ietf:params:xml:ns:pidf”;
XElement root=XElement.Load(@“c:\b.txt”,LoadOptions.PreserveWhitespace);
IEnumerable地址=
来自root.Elements中的el(defaultNamespace+“Address”)
选择el;
int c=address.Count();
var address = root.Elements()
                  .Where(node => node.Name.LocalName == "Address");
//address will contain the same nodes, as in previous example
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();