2010-08-09 3 views
3

J'ai un résultat SOAP XML: Comme vous pouvez le voirXML + XPATH: Toute façon de travailler avec un espace de noms par défaut?

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
    <CreateCIInStockResponse xmlns="http://somenamespace.com/"> 
     <CreateCIInStockResult> 
     <Status>OK</Status> 
     <Data>SOMERESULT</Data> 
     </CreateCIInStockResult> 
    </CreateCIInStockResponse> 
    </soap:Body> 
</soap:Envelope> 

, l'espace de nom défini dans CreateCIInStockResponse utilise un espace de noms par défaut - aucun préfixe défini.

je peux obtenir à la fois Statut et données si nous utilisons

/soap:Envelope/soap:Body/node()/node()/node()/text() 

Ai-je raison, qu'il n'y a aucun moyen - en utilisant XPath - pour accéder au contenu de « données » directement?

Mon problème est, que je ne peux ni modifier l'appel au webservice ni modifier le résultat revenant du webservice. Tout ce que je peux faire est d'utiliser un XPath pour extraire mes données.

Des suggestions?

+0

Quel est l'analyseur xml sous-jacent que vous utilisez? Vtd-xml vous permet en réalité d'accéder à l'espace de noms par défaut si elle n'est pas préfixée. –

+0

Je n'utilise pas l'analyseur moi-même. C'est une application compilée complète (comme dans la boîte noire) qui prend XML d'un côté, XPATH de l'autre côté. Elle fait quelque chose, obtient une valeur et continue à travailler avec cette valeur. – BlaM

Répondre

8

Assigner http://somenamespace.com/ à un préfixe d'espace de noms, dites "def", et l'utiliser dans l'expression XPath:

/soap: Envelope/soap: Body/def: CreateCIInStockResponse/DEF: Les données

Comment affecter le préfixe variera en fonction de votre processeur XPath.

Mise à jour: approche alternative si l'attribution d'un préfixe est pas une option:

/soap:Envelope/soap:Body/*[local-name()='CreateCIInStockResponse']/*[local-name()='Data'] 

Pour être absolument sûr que vous accédez aux éléments que vous attendez, vous pouvez ajouter namespace-uri() = ' http://somenamespace.com/ 'aussi bien.

+0

Mon problème est, que je ne peux pas accéder au code de programme de l'application en utilisant le XPath. J'ai juste une boîte de saisie où je peux entrer ma chaîne XPath. Mais votre réponse est exactement ce que j'avais peur d'obtenir comme réponse ... * soupir * – BlaM

+0

Bonne réponse, et bon montage! +1 –

+0

Super, ça marche magnifiquement! – BlaM

Questions connexes