2009-06-01 22 views
35

如何從XDocument獲取NameTable?如何從XDocument獲取NameTable?

它似乎沒有XmlDocument所具有的NameTable屬性。

編輯:由缺乏答案判斷我猜我可能會錯過這一點。

我做的XPath查詢針對這樣一個XDocument ...

document.XPathSelectElements("//xx:Name", namespaceManager); 

它工作正常,但我必須手動添加我想使用XmlNamespaceManager的命名空間,而不是從檢索現有nametable XDocument像你一樣使用XmlDocument。

+0

請看看在給定的鏈接,一個可能的答案.... http://stackoverflow.com/questions/879728/can-i-use-predefined-namespaces-when-loading- an-xdocument – 2010-05-14 08:26:00

回答

25

您需要通過XmlReader推送XML並使用XmlReader的NameTable屬性。

如果你已經有了要裝載到一個XDocument的Xml然後確保你使用一個XmlReader加載的XDocument: -

XmlReader reader = new XmlTextReader(someStream); 
XDocument doc = XDocument.Load(reader); 
XmlNameTable table = reader.NameTable; 

如果你是從頭開始構建的Xml用的XDocument你將需要調用的XDocument的CreateReader方法然後有東西消耗讀者。一旦讀者已經被使用(比如說加載另一個XDocument,但是更好的是一些什麼都不做,只會導致讀者運行XDocument的內容),那麼您可以檢索NameTable。

20

我做了這樣的:

//Get the data into the XDoc 
XDocument doc = XDocument.Parse(data); 
//Grab the reader 
var reader = doc.CreateReader(); 
//Set the root 
var root = doc.Root; 
//Use the reader NameTable 
var namespaceManager = new XmlNamespaceManager(reader.NameTable); 
//Add the GeoRSS NS 
namespaceManager.AddNamespace("georss", "http://www.georss.org/georss"); 
//Do something with it 
Debug.WriteLine(root.XPathSelectElement("//georss:point", namespaceManager).Value); 

馬特

+0

如果您只有xml文本或XDocument是唯一的方法,但是如果您有XmlReader,則以前的解決方案會更加高效。 – dmihailescu 2015-03-10 20:59:51

3

我必須手動添加我想使用的 XmlNamespaceManager的命名空間,而不是從 的的XDocument像檢索現有nametable你會用一個XmlDocument。

XDocument project = XDocument.Load(path); 
//Or: XDocument project = XDocument.Parse(xml); 
var nsMgr = new XmlNamespaceManager(new NameTable()); 
//Or: var nsMgr = new XmlNamespaceManager(doc.CreateReader().NameTable); 
nsMgr.AddNamespace("msproj", "http://schemas.microsoft.com/developer/msbuild/2003"); 
var itemGroups = project.XPathSelectElements(@"msproj:Project/msproj:ItemGroup", nsMgr).ToList();