2009-06-01 6 views
35

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

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

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

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

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

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

+0

пожалуйста, смотрите на данной ссылке для возможного ответа .... http://stackoverflow.com/questions/879728/can-i-use-predefined-namespaces-when-loading- a-xdocument –

ответ

25

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

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

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

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

20

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

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

+0

, если у вас есть только текст xml или XDocument, это единственный способ, но если у вас есть XmlReader, предыдущее решение более эффективно. – dmihailescu

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(); 
Смежные вопросы