2017-04-06 48 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