2009-06-01 6 views
35

Come posso ottenere un NameTable da un XDocument?Come posso ottenere un NameTable da un XDocument?

Non sembra che abbia la proprietà NameTable di XmlDocument.

EDIT: A giudicare dalla mancanza di una risposta, suppongo che possa mancare il punto.

sto facendo le query XPath contro un XDocument come questo ...

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

funziona benissimo ma devo aggiungere manualmente gli spazi dei nomi che voglio utilizzare al XmlNamespaceManager piuttosto che recuperare il NameTable esistente dal XDocument come faresti con un XmlDocument.

+0

si prega di dare un'occhiata al link indicato per una possibile risposta .... http://stackoverflow.com/questions/879728/can-i-use-predefined-namespaces-when-loading- an-xdocument –

risposta

25

È necessario inserire il codice XML tramite XmlReader e utilizzare la proprietà NameTable di XmlReader.

Se si dispone già di Xml si sta caricando in un XDocument quindi assicurarsi di utilizzare un XmlReader per caricare il XDocument: -

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

Se state costruendo Xml da zero con XDocument è necessario chiamare XDocument di Il metodo CreateReader quindi ha qualcosa che consuma il lettore. Una volta che il lettore è stato utilizzato (ad esempio, caricando un altro XDocument, ma sarebbe meglio non far nulla che non si verifichi, il che fa sì che il lettore possa scorrere i contenuti di XDocument) è possibile recuperare il NameTable.

20

ho fatto in questo modo:

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

se hai solo il testo xml o XDocument che è l'unico modo, ma se hai avuto XmlReader la soluzione precedente è più efficiente. – dmihailescu

3

devo aggiungere manualmente gli spazi dei nomi che voglio utilizzare al XmlNamespaceManager piuttosto che recuperare il NameTable esistente dal il XDocument come lo faresti con 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();