为什么的XDocument不能得到元件出这个wellform XML文本的?(Why XDocume

2019-08-07 06:36发布

我试图得到的值Address从以下XML文本元素,但它没有找到它,除非我删除xmlns="http://www.foo.com"Root元素。 然而,XML是即使它有效。 这里有什么问题吗?

因为我越来越从Web服务的XML文本,我不拥有控制权,但我可以剥离出xmlns的一部分,如果我必须作为最后的手段。

<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns="http://www.foo.com">
  <Address>Main St SW</Address>
</Root>
var doc = XDocument.Parse(xmlTextAbove);
var address = doc.Descendants().Where(o => o.Name == "Address").FirstOrDefault();
Console.WriteLine(address.Value); // <-- error, address is null.

Answer 1:

当你的XML包含一个名称空间,就不得不提到,在代码。 这将工作:

    XNamespace nsSys = "http://www.foo.com";
    XElement xDoc = XElement.Load("1.xml");
    XElement xEl2 = xDoc.Descendants(nsSys + "Address").FirstOrDefault();

但是我不得不改变你的XML一点点,因为它包含重复xmlns:xsixmlns:xsd应该每XML格式只出现一次:

<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns="http://www.foo.com" >
  <Address>Main St SW</Address>
</Root>

相关文章在MSDN: 的XNamespace类



Answer 2:

文档根目录的XML命名空间中包含的文字表述o.Name ,这实际上是一个实例XName这样的条件永远不匹配。

最简单的解决办法是使用LocalName进行比较:

.Where(o => o.Name.LocalName == "Address")


文章来源: Why XDocument can't get element out of this wellform XML text?