2009-02-18 5 views
10

J'ai ce document XML avec des espaces de noms et je veux extraire certains nœuds en utilisant XPath.XPath sur un document XML avec espace de noms

Voici le document:

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

Quelle est l'expression XPath va être si je veux extraire tous les "éléments" anyType avec xsi: type = "document"?

J'ai essayé ceci:

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

et il ne fonctionne pas:

+0

version de XPath utilisez-vous? Les versions de xpath gèrent les espaces de noms différemment? –

+0

On dirait que je dois dire: '// xmlns: anyType [@xsi: type = "Document"]' pour que cela fonctionne – 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

Répondre

16

Si vous utilisez C#, vous devez spécifier l'espace de noms pour l'élément « anyType » dans votre 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

Quoi est en place avec 'a: anyType'? Est-ce une sorte de valeur magique? – jcollum

+0

Non, c'est le nom de l'élément XML recherché dans la question ci-dessus. – David

+0

ah, je vois, n'a pas fait défiler assez loin – jcollum

0

Je pense que

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

Fera ce que vous voulez.

+0

Merci, je pense que ce qui ne va pas dans mon expression originale est que je dois préfixer anyType avec l'espace de noms "xmlns". – EnToutCas

0

de cette façon, vous n'avez pas besoin de spécifier l'espace de noms:

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