C# 如何从XDocument获取名称表?
如何从XDocument获取名称表 它似乎没有XmlDocument所具有的NameTable属性 编辑:从缺少答案来看,我猜我可能没有抓住要点 我正在对这样的XDocument执行XPath查询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
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);
}