2010-07-05 4 views
4

Je suis frustré d'avoir extrait certains éléments d'un document JDOM en utilisant une expression XPath. Voici un exemple de document XML: je souhaite supprimer complètement les éléments ItemCost du document, mais j'ai du mal à obtenir une expression XPath pour évaluer quoi que ce soit en ce moment.Interactions JDOM, XPath et Namespace

<srv:getPricebookByCompanyResponse xmlns:srv="http://ess.com/ws/srv"> 
    <srv:Pricebook> 
     <srv:PricebookName>Demo Operator Pricebook</srv:PricebookName> 
     <srv:PricebookItems> 
      <srv:PricebookItem> 
       <srv:ItemName>Demo Wifi</srv:ItemName> 
       <srv:ProductCode>DemoWifi</srv:ProductCode> 
       <srv:ItemPrice>15</srv:ItemPrice> 
       <srv:ItemCost>10</srv:ItemCost> 
      </srv:PricebookItem> 
      <srv:PricebookItem> 
       <srv:ItemName>1Mb DIA</srv:ItemName> 
       <srv:ProductCode>Demo1MbDIA</srv:ProductCode> 
       <srv:ItemPrice>20</srv:ItemPrice> 
       <srv:ItemCost>15</srv:ItemCost> 
      </srv:PricebookItem> 
     </srv:PricebookItems> 
    </srv:Pricebook> 
    </srv:getPricebookByCompanyResponse> 

J'utiliser normalement juste une expression telle que // srv: ItemCost pour identifier ces éléments, qui fonctionne très bien sur d'autres documents, mais ici, il revient sans cesse 0 nœuds dans la liste. Voici le code que je l'ai utilisé:

Namespace ns = Namespace.getNamespace("srv","http://ess.com/ws/srv"); 
XPath filterXpression = XPath.newInstance("//ItemCost"); 
filterXpression.addNamespace(ns); 
List nodes = filterXpression.selectNodes(response); 

où la réponse est un élément JDOM contenant l'extrait de code XML ci-dessus (vérifié avec un XMLOutputter). les nœuds ont continuellement size() == 0 lors de l'analyse de ce document. En utilisant l'analyseur XPath dans Eclipse sur le même document, cette expression ne fonctionne pas non plus. Après avoir creusé, j'ai demandé à l'évaluateur Eclipse de travailler avec l'expression suivante: // * [nom-local() = 'ItemCost'], mais en remplaçant // srv: ItemCost dans le code Java, cela ne produisait toujours aucun résultat. Une autre chose que j'ai remarquée est que si je supprime la déclaration d'espace de noms du XML, // srv: ItemCost résoudra correctement dans l'analyseur Eclipse, mais je ne peux pas le retirer du XML. Je me suis gratté la tête pour nos heures sur celui-ci maintenant, et j'apprécierais vraiment de me pousser dans la bonne direction.

Un grand merci

Edit: Code fixe -

Document build = new Document(response); 
XPath filterXpression = XPath.newInstance("//srv:ItemCost"); 
List nodes = filterXpression.selectNodes(build); 
+0

Désolé @Bryn, je sais comment faire cela en C#, mais je n'ai aucune expérience avec JDOM :(Donc, j'ai supprimé ma réponse. –

Répondre

1

étrange, en effet ... Je l'ai testé sur mon côté avec jdom et votre extrait a produit une liste vide, les travaux suivants comme prévu:

public static void main(String[] args) throws JDOMException, IOException { 
    File xmlFile = new File("sample.xml"); 
    SAXBuilder builder = new SAXBuilder(); 
    Document build = builder.build(xmlFile);   
    XPath filterXpression = XPath.newInstance("//srv:ItemCost"); 
    System.out.println(filterXpression.getXPath()); 
    List nodes = filterXpression.selectNodes(build);   
    System.out.println(nodes.size()); 
} 

Il produit la sortie:

//srv:ItemCost 
2 
+2

Merci Andreas - vous m'avez mis sur la bonne voie ici. Malheureusement, l'entrée vient en tant qu'élément JDOM déjà construit, donc le sérialiser pour le traitement par un SAXBuilder est un petit OTT. Cependant, juste en jouant, il semble que tout ce qui était nécessaire était d'emballer l'élément dans un document - tout fonctionne bien maintenant. Aimerait savoir pourquoi si quelqu'un peut le comprendre? –

+0

@BrynSadler Il suffisait d'envelopper le JDOM 'Element' dans un' Document', et ma journée a été sauvegardée! Merci beaucoup! :) –