Как я могу получить NameTable из XDocument? - PullRequest
38 голосов
/ 01 июня 2009

Как мне получить NameTable из XDocument?

Кажется, у него нет свойства NameTable, которое есть у XmlDocument.

РЕДАКТИРОВАТЬ: Судя по отсутствию ответа, я предполагаю, что, возможно, я упускаю суть.

Я делаю XPath-запросы к XDocument, как это ...

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

Работает нормально, но мне нужно вручную добавить пространства имен, которые я хочу использовать, в XmlNamespaceManager вместо того, чтобы извлекать существующую именную таблицу из XDocument, как вы это делаете с XmlDocument.

Ответы [ 3 ]

29 голосов
/ 01 июня 2009

Вам нужно протолкнуть XML через XmlReader и использовать свойство NameTable XmlReader.

Если у вас уже есть Xml, который вы загружаете в XDocument, убедитесь, что вы используете XmlReader для загрузки XDocument: -

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

Если вы создаете Xml с нуля с помощью XDocument, вам нужно будет вызвать метод CreateReader в XDocument, а затем что-то потреблять читателя. После того, как читатель будет использован (скажем, загрузка другого XDocument, но лучше будет, если кто-то ничего не делает, который просто заставляет читателя бегать по содержимому XDocument), вы можете получить NameTable.

22 голосов
/ 20 октября 2010

Я сделал это так:

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

Мэтт

5 голосов
/ 01 ноября 2014

Мне нужно вручную добавить пространства имен, которые я хочу использовать, к XmlNamespaceManager вместо извлечения существующей именной таблицы из XDocument, как и в случае с 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();
...