2009-02-18 4 views
10

Sto avendo questo documento XML con namespace e voglio estrarre alcuni nodi usando XPath.XPath su un documento XML con namespace

Ecco il 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> 

Qual è l'espressione XPath sta per essere se voglio estrarre tutti gli elementi "anyType" con xsi: type = "Documento"?

Ho provato questo:

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

e non funziona:

+0

quale versione di XPath stai usando? le versioni xpath gestiscono gli spazi dei nomi in modo diverso? –

+0

Sembra che devo dire: '// xmlns: anyType [@xsi: type = "Document"]' per farlo funzionare – EnToutCas

+0

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

risposta

16

Se si sta utilizzando C#, allora è necessario specificare lo spazio dei nomi per l'elemento "anyType" nella vostra 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

Cosa funziona con 'a: anyType'? È una sorta di valore magico? – jcollum

+0

No, questo è il nome dell'elemento XML ricercato nella domanda precedente. – David

+0

ah, vedo, non scorreva abbastanza lontano – jcollum

0

penso che

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

Farà quello che vuoi.

+0

Grazie, penso che cosa c'è di sbagliato nella mia espressione originale è che ho bisogno di prefisso anyType con lo spazio dei nomi "xmlns". – EnToutCas

0

in questo modo non è necessario specificare namespace:

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