2009-02-18 21 views
10

Tengo este documento XML con espacios de nombres y quiero extraer algunos nodos con XPath.XPath en un documento XML con espacio de nombres

Aquí está el documento:

<ArrayOfAnyType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/"> 
    <anyType xsi:type="Document"> 
    <Id>5</Id> 
    <Title>T1</Title> 
    </anyType> 

    <anyType xsi:type="Document"> 
    <Id>15</Id> 
    <Title>T15</Title> 
    </anyType> 
</ArrayOfAnyType> 

¿Cuál es la expresión XPath va a ser si quiero extraer todos los elementos "anyType" con xsi: type = "Documento"?

He intentado esto:

//anyType[@xsi:type="Document"] 

y no funciona:

+0

la versión de XPath se utiliza? Las versiones xpath manejan espacios de nombres de manera diferente? –

+0

Parece que tengo que decir: '// xmlns: anyType [@xsi: type = "Document"]' para que funcione – EnToutCas

+0

Duped: - http://stackoverflow.com/questions/536441/xpath-namespace-driving -me-crazy - http://stackoverflow.com/questions/11345/xpaths-and-default-namespaces - http://stackoverflow.com/questions/103576/whats-wrong-with-my-xpath-xml – annakata

Respuesta

16

Si está usando C# y luego es necesario que especifique el espacio de nombres para el elemento "anyType" en su XPath:

var xml = new XmlDocument(); 
xml.LoadXml("your xml"); 
var names = new XmlNamespaceManager(xml.NameTable); 
names.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
names.AddNamespace("a", "http://tempuri.org/"); 
var nodes = xml.SelectNodes("//a:anyType[@xsi:type='Document']", names); 
+0

What está arriba con 'a: anyType'? ¿Es eso algún tipo de valor mágico? – jcollum

+0

No, ese es el nombre del elemento XML que se busca en la pregunta anterior. – David

+0

ah, ya veo, no se desplazó lo suficiente – jcollum

0

creo que

//anyType[namespace-uri() = "http://www.w3.org/2001/XMLSchema-instance"][local-name() = "type"] 

Hará lo que quiera.

+0

Gracias, creo que lo que está mal en mi expresión original es que necesito prefijar anyType con el espacio de nombres "xmlns". – EnToutCas

0

de esta manera no es necesario especificar espacio de nombres:

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml("your xml"); 
XmlNode node = xmlDoc.SelectSingleNode("/*[local-name() = 'anyType']"); 
XmlNode nodeToImport = xmlDoc2.ImportNode(node, true); 
xmlDoc2.AppendChild(nodeToImport); 
Cuestiones relacionadas