Comment ignorer les espaces de noms lors de la sélection de noeuds XML avec XPath

Je dois parsingr un document XML qui ressemble à ceci:

    CAISO   OASIS PPT AS_RESULTS HASP MW ENDING 3600   NS_PROC_MW AS_SP26_EXP 2010-11-17 1 0  

Le problème est que l’espace de noms “http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd” peut parfois être différent. Je veux l’ignorer complètement et simplement récupérer mes données de la balise MessagePayload en aval.

Le code que j’utilise jusqu’à présent est le suivant:

 Ssortingng[] namespaces = new Ssortingng[1]; Ssortingng[] namespaceAliases = new Ssortingng[1]; namespaceAliases[0] = "ns0"; namespaces[0] = "http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd"; File inputFile = new File(inputFileName); Map namespaceURIs = new HashMap(); // This query will return all of the ASR records. Ssortingng xPathExpression = "/ns0:OASISReport /ns0:MessagePayload /ns0:RTO /ns0:REPORT_ITEM /ns0:REPORT_DATA"; xPathExpression += "|/ns0:OASISReport /ns0:MessagePayload /ns0:RTO /ns0:REPORT_ITEM /ns0:REPORT_HEADER"; // Load up the raw XML file. The parameters ignore whitespace and other // nonsense, // reduces DOM tree size. SAXReader reader = new SAXReader(); reader.setSsortingpWhitespaceText(true); reader.setMergeAdjacentText(true); Document inputDocument = reader.read(inputFile); // Relate the aliases with the namespaces if (namespaceAliases != null && namespaces != null) { for (int i = 0; i < namespaceAliases.length; i++) { namespaceURIs.put(namespaceAliases[i], namespaces[i]); } } // Cache the expression using the supplied namespaces. XPath xPath = DocumentHelper.createXPath(xPathExpression); xPath.setNamespaceURIs(namespaceURIs); List asResultsNodes = xPath.selectNodes(inputDocument.getRootElement()); 

Cela fonctionne bien si l’espace de noms ne change jamais mais ce n’est évidemment pas le cas. Que dois-je faire pour le faire ignorer l’espace de noms? Ou si je connais l’ensemble de toutes les valeurs d’espace de noms possibles, comment puis-je les transmettre à l’instance XPath?

Utiliser :

 /*/*/*/*/* [local-name()='REPORT_DATA' or local-name()='REPORT_HEADER' ] 

Ceci est la FAQ (mais je suis paresseux pour rechercher des doublons aujourd’hui)

Dans XPath 1.0

 //*[local-name()='name'] 

Sélectionne n’importe quel élément avec “name” comme nom local .

Dans XPath 2.0, vous pouvez utiliser:

 //*:name