2010-10-27 6 views
0

Salut, je suis en train d'obtenir une valeur variable (ref dans les contractRef) dans le fichier XML ci-dessous, mais quand j'utilise ce que je suppose être le XPath:Quel serait le XPath pour cette xml

/discovery/contractRef[@xmlns='http://schemas.xmlsoap.org/disco/scl/']/@ref 

ça ne retourne rien. Comment puis-je obtenir cette variable, qu'est-ce qui me manque? Merci

<?xml version="1.0" encoding="utf-8"?> 
<discovery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/disco/"> 
    <contractRef ref="http://127.0.0.1/Services/Core/Calendar/LBCalendar.svc?wsdl" docRef="http://127.0.0.1/Services/Core/Calendar/LBCalendar.svc" xmlns="http://schemas.xmlsoap.org/disco/scl/" /> 
</discovery> 

Répondre

3

Ceci est une FAQ. L'élément <discovery> se trouve dans l'espace de noms http://schemas.xmlsoap.org/disco/ et l'élément enfant <contractRef> est dans l'espace de noms http://schemas.xmlsoap.org/disco/scl/ Vous devez enregistrer ces espaces de noms avec un préfixe, puis utiliser ces préfixes dans votre expression XPath. La procédure d'enregistrement dépend de la langue/de l'environnement où l'expression XPath est utilisée. Si le XPath est utilisé dans un document XML, puis préfixes sont « enregistrés » juste en déclarant un espace de noms préfixée, par exemple xmlns:scl="http://schemas.xmlsoap.org/disco/scl/"

Supposons que http://schemas.xmlsoap.org/disco/ est enregistré au préfixe d et http://schemas.xmlsoap.org/disco/scl/ est enregistré à préfixe scl alors un XPath correct l'expression serait

/d:discovery/scl:contractRef/@ref 

Les espaces de noms sont une fonctionnalité fondamentale dans XML et XPath. S'il vous plaît, prenez le temps de les apprendre. Un hack pour éviter d'utiliser des préfixes d'espace de noms dans les expressions XPath est d'utiliser la fonction local-name()

/*[local-name() = 'discovery*]/*[local-name() = 'contractRef']/@ref 

Notez que le nom d'attribut n'a pas besoin d'un préfixe d'espace de noms, car il n'appartient à l'espace de noms.

+0

Merci pour votre réponse informative – Martin

+0

+1 Bonne réponse. Un mineur: à partir de la question, il semble que @Martin essaie de tester un attribut 'xmlns'. Il doit souligner que les déclarations d'espace de noms ne sont pas des attributs, conformément à XDM et XML Infoset, dans les espaces de noms d'étendue sont accessibles par un accesseur différent. –

Questions connexes