Ray*_*eng 2 c# xml linq-to-xml
我试图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.
Jon*_*Jon 11
文档根的XML命名空间包含在文本表示中o.Name,实际上是XName条件永远不匹配的实例.
最简单的解决方法是LocalName用于比较:
.Where(o => o.Name.LocalName == "Address")
hor*_*rgh 10
由于您的xml包含命名空间,您必须在代码中提及它.这将有效:
    XNamespace nsSys = "http://www.foo.com";
    XElement xDoc = XElement.Load("1.xml");
    XElement xEl2 = xDoc.Descendants(nsSys + "Address").FirstOrDefault();
但是我必须稍微改变你的xml,因为它包含重复xmlns:xsi,xmlns: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类