C# 如何从XDocument获取名称表?

C# 如何从XDocument获取名称表?,c#,xml,xpath,linq-to-xml,C#,Xml,Xpath,Linq To Xml,如何从XDocument获取名称表 它似乎没有XmlDocument所具有的NameTable属性 编辑:从缺少答案来看,我猜我可能没有抓住要点 我正在对这样的XDocument执行XPath查询 document.XPathSelectElements("//xx:Name", namespaceManager); 它可以正常工作,但我必须手动将要使用的名称空间添加到XmlNamespaceManager,而不是像使用XmlDocument一样从XDocument检索现有名称表。您需要通过X

如何从XDocument获取名称表

它似乎没有XmlDocument所具有的NameTable属性

编辑:从缺少答案来看,我猜我可能没有抓住要点

我正在对这样的XDocument执行XPath查询

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

它可以正常工作,但我必须手动将要使用的名称空间添加到XmlNamespaceManager,而不是像使用XmlDocument一样从XDocument检索现有名称表。

您需要通过XmlReader推送XML,并使用XmlReader的nametable属性

如果已将Xml加载到XDocument中,请确保使用XmlReader加载XDocument:-

XmlReader reader = new XmlTextReader(someStream);
XDocument doc = XDocument.Load(reader);
XmlNameTable table = reader.NameTable;
如果您是使用XDocument从头开始构建Xml,则需要调用XDocument的CreateReader方法,然后让某些内容使用该读取器。一旦读卡器被使用(比如加载另一个XDocument,但最好是一些不做任何事情的接收器,这只会导致读卡器浏览XDocument的内容),您就可以检索名称表。

我这样做:

//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);  
马特

我必须手动将要使用的名称空间添加到 XmlNamespaceManager,而不是从 XDocument就像您使用XmlDocument一样


它也可以由XPathNavigator完成。当您既不知道Xml文件编码,也不知道名称空间前缀时,这可能很有用

XDocument xdoc = XDocument.Load(sourceFileName);
XPathNavigator navi = xdoc.Root.CreateNavigator();
XmlNamespaceManager xmlNSM = new XmlNamespaceManager(navi.NameTable);
//Get all the namespaces from navigator
IDictionary<string, string> dict = navi.GetNamespacesInScope(XmlNamespaceScope.All);
//Copy them into Manager
foreach (KeyValuePair<string, string> pair in dict)
{
    xmlNSM.AddNamespace(pair.Key, pair.Value);
}
XDocument xdoc=XDocument.Load(sourceFileName);
XPathNavigator navi=xdoc.Root.CreateNavigator();
XmlNamespaceManager xmlNSM=新的XmlNamespaceManager(navi.NameTable);
//从navigator获取所有名称空间
IDictionary dict=navi.GetNamespacesInScope(XmlNamespaceScope.All);
//将它们复制到Manager中
foreach(dict中的KeyValuePair对)
{
AddNamespace(pair.Key,pair.Value);
}

请查看给定链接以获得可能的答案。。。。如果您只有xml文本或XDocument,这是唯一的方法,但是如果您有XmlReader,前面的解决方案会更有效。FWIW,只是澄清一下,
XmlNameSpaceManager
似乎可以在使用
System.Xml.Xpath
扩展时使用任何
NameTable
(甚至是一个新的空表)-它不必与
XDocument
相关,这是另一个工作示例
XDocument xdoc = XDocument.Load(sourceFileName);
XPathNavigator navi = xdoc.Root.CreateNavigator();
XmlNamespaceManager xmlNSM = new XmlNamespaceManager(navi.NameTable);
//Get all the namespaces from navigator
IDictionary<string, string> dict = navi.GetNamespacesInScope(XmlNamespaceScope.All);
//Copy them into Manager
foreach (KeyValuePair<string, string> pair in dict)
{
    xmlNSM.AddNamespace(pair.Key, pair.Value);
}