Как получить 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();