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

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

У него нет свойства NameTable, которое имеет XmlDocument.

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Matt

Ответ 3

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