2009-06-01 24 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();