2017-04-06 60 views
2

我收到它具有根节点的xmlns命名空间分配上的XML文件:不能xmlns的价值解析XML

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

我不知道如何使用XPath以检索日期元素,我想

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

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

我尝试的xmlns添加到XmlNamespaceManager的,但我得到这个错误:

Prefix "xmlns" is reserved for use by XML.

我怎样才能获得的价值?

+0

[使用XPath和VB.NET解析含有namespsaces XML](HTTP的可能的复制:// stackoverflow.com/questions/16949495/using-xpath-and-vb-net-to-parse-xml-containing-namespsaces) – DWRoelands

回答

5

您应该在指定元素名称时使用名称空间。默认命名空间是很容易得到与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); 
+0

我不工作,我不明白为什么它应该工作。 XML文件中没有节点使用我添加到XmlNamespaceManager的命名空间前缀来定义。 – Angela

+0

@Angela它的工作原理,我不明白为什么它不应该工作。你有没有试过运行这段代码? –

+1

我刚刚在LinqPad上试了一下,可以确认这两个谢尔盖的建议工作。 –

0

我会使用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); 
+0

你仍然需要照顾名字空间。因此,在root.Elements(ns +“Date”)中添加_var ns = root.GetDefaultNamespace(); _和_from el_ –

+0

这是一个重复的问题,http://stackoverflow.com/questions/4857172/using-xelement-to -query-FOR-A-节点的名称空间。 @PalleDue很好的通话 – Programmer