2

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

由于我是从 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.
4

2 回答 2

11

由于您的 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 类

于 2013-01-18T00:53:47.927 回答
11

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

最简单的解决方法是LocalName用于比较:

.Where(o => o.Name.LocalName == "Address")
于 2013-01-18T00:53:57.003 回答