为什么XDocument无法从这个良好的XML文本中获取元素?

我试图从以下XML文本中获取Address元素的值,但除非我从Root元素中删除xmlns="http://www.foo.com" ,否则它找不到它。 但是,即使使用它,XML也是有效的。 这有什么问题?

由于我从Web服务获取XML文本,因此我无法控制它,但如果必须作为最后的手段,我可​​以删除xmlns部分。

   
Main St SW
 var doc = XDocument.Parse(xmlTextAbove); var address = doc.Descendants().Where(o => o.Name == "Address").FirstOrDefault(); Console.WriteLine(address.Value); // <-- error, address is null. 

由于您的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格式只能出现一次:

   
Main St SW

MSDN中的相关文章: XNamespace类

文档根的XML命名空间包含在o.Name的文本表示中,它实际上是XName一个实例,因此条件永远不会匹配。

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

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