2009-06-01 17 views
35

¿Cómo obtengo una NameTable de un XDocument?¿Cómo obtengo una NameTable de un XDocument?

Parece que no tiene la propiedad NameTable que tiene XmlDocument.

EDIT: Juzgando por la falta de una respuesta, supongo que me puede estar perdiendo el punto.

que estoy haciendo consultas XPath contra un XDocument así ...

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

que trabaja muy bien, pero tengo que añadir manualmente los espacios de nombres que desea utilizar para la XmlNamespaceManager en lugar de recuperar la NameTable existente de la XDocument como lo haría con un XmlDocument.

+0

favor, eche un vistazo al enlace dado para una posible respuesta .... http://stackoverflow.com/questions/879728/can-i-use-predefined-namespaces-when-loading- an-xdocument –

Respuesta

25

Debe empujar el XML a través de un XmlReader y usar la propiedad NameTable de XmlReader.

Si ya tiene XML que va a cargar en un XDocument continuación, asegúrese de que utiliza un XmlReader para cargar el XDocument: -

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

Si usted está construyendo XML desde cero con XDocument tendrá que llamar XDocument de El método CreateReader luego tiene algo que consume el lector. Una vez que se haya usado el lector (por ejemplo, cargando otro XDocument pero es mejor que no se haga nada, lo que hace que el lector corra por los contenidos del XDocument) puede recuperar el NameTable.

20

lo hice así:

//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 solo tenía el texto xml o el XDocument esa es la única manera, pero si tuviera el XmlReader la solución anterior es más eficiente. – dmihailescu

3

tengo que añadir manualmente los espacios de nombres que desea utilizar para la XmlNamespaceManager en lugar de recuperar la NameTable existente de la XDocument como lo harías 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(); 
Cuestiones relacionadas