【问题标题】:Cannot parse XML with xmlns value无法使用 xmlns 值解析 XML
【发布时间】:2017-04-06 13:36:28
【问题描述】:

我收到一个 XML 文件,它在根节点上分配了一个 xmlns 命名空间:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Message xmlns="http://www.myAddress.com/DataRequest/message/">
  <Date>2017/01/01</Date>
</Message>  

我不知道如何使用 XPath 检索 Date 元素,我试过了

  var root = xDocument.Root;
  var dateElement = root.XPathSelectElement("/Message/Date");

如果我从根 xml 中删除命名空间,那么我可以使用“/Message/Date”检索值。

我尝试将 xmlns 添加到 XmlNamespaceManager,但出现此错误:

前缀“xmlns”保留给 XML 使用。

如何获得价值?

【问题讨论】:

标签: c# xml


【解决方案1】:

当你指定元素的名字时你应该使用命名空间。使用XElement.GetDefaultNamespace() 方法很容易获得默认命名空间:

var ns = root.GetDefaultNamespace();
var dateElement = (DateTime)root.Element(ns + "Date");

如果你想使用 XPath:

XmlNamespaceManager manager = new XmlNamespaceManager(new NameTable());
manager.AddNamespace("ns", root.GetDefaultNamespace().ToString());
var dateElement = (DateTime)root.XPathSelectElement("/ns:Message/ns:Date", manager);

【讨论】:

  • 我不工作,我不明白为什么它应该工作。 XML 文件中没有使用我添加到 XmlNamespaceManager 的命名空间前缀定义的节点。
  • @Angela 它可以工作,我不明白为什么它不应该工作。您是否尝试过运行此代码?
  • 我刚刚在 LinqPad 中试用过,可以确认 Sergey 的两个建议都有效。
【解决方案2】:

我建议使用 LINQ。

这里是代码示例的链接:https://msdn.microsoft.com/en-us/library/mt693115.aspx

代码如下:

XElement root = XElement.Load("Message.xml");  
IEnumerable<XElement> dateNode=  
    from el in root.Elements("Date")   
    select el;  
foreach (XElement el in dateNode)  
    Console.WriteLine(el);  

【讨论】:

  • 您仍然需要注意命名空间。所以添加 var ns = root.GetDefaultNamespace();from el in root.Elements(ns+"Date")
  • 这是一个重复的问题,stackoverflow.com/questions/4857172/…。 @PalleDue 好电话
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多