2009-06-01 4 views
35

Comment puis-je obtenir un NameTable à partir d'un XDocument?Comment puis-je obtenir un NameTable à partir d'un XDocument?

Il ne semble pas avoir la propriété NameTable de XmlDocument.

EDIT: À en juger par le manque de réponse, je suppose que je pourrais manquer le point.

Je suis en train de faire des requêtes XPath contre un XDocument comme ça ...

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

Il fonctionne très bien, mais je dois ajouter manuellement les espaces de noms que je veux utiliser au lieu XmlNamespaceManager que de récupérer le NameTable existant de la XDocument comme vous le feriez avec un XmlDocument.

+0

s'il vous plaît jeter un oeil sur le lien donné une réponse possible .... http://stackoverflow.com/questions/879728/can-i-use-predefined-namespaces-when-loading- an-xdocument –

Répondre

25

Vous devez placer le code XML via un XmlReader et utiliser la propriété NameTable de XmlReader.

Si vous avez déjà Xml vous chargez dans un XDocument alors assurez-vous d'utiliser un XmlReader pour charger le XDocument: -

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

Si vous construisez Xml à partir de zéro avec XDocument vous devrez appeler XDocument de Méthode CreateReader puis avoir quelque chose consomment le lecteur. Une fois que le lecteur a été utilisé (par exemple, charger un autre document XDocument mais mieux ne pas faire quoi que ce soit qui entraîne simplement le lecteur à parcourir le contenu de XDocument), vous pouvez récupérer le NameTable.

20

Je l'ai fait comme ceci:

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

si vous n'aviez que le texte xml ou le XDocument, mais si vous aviez le XmlReader, la solution précédente est plus efficace. – dmihailescu

3

Je dois ajouter manuellement les espaces de noms que je veux utiliser la XmlNamespaceManager plutôt que de récupérer le NameTable existant à partir le XDocument comme vous le feriez avec un 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(); 
Questions connexes