如何在使用XPathselectXML节点时忽略名称空间

我必须parsing一个如下所示的XML文档:

<?xml version="1.0" encoding="UTF-8" ?> <m:OASISReport xmlns:m="http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd"> <m:MessagePayload> <m:RTO> <m:name>CAISO</m:name> <m:REPORT_ITEM> <m:REPORT_HEADER> <m:SYSTEM>OASIS</m:SYSTEM> <m:TZ>PPT</m:TZ> <m:REPORT>AS_RESULTS</m:REPORT> <m:MKT_TYPE>HASP</m:MKT_TYPE> <m:UOM>MW</m:UOM> <m:INTERVAL>ENDING</m:INTERVAL> <m:SEC_PER_INTERVAL>3600</m:SEC_PER_INTERVAL> </m:REPORT_HEADER> <m:REPORT_DATA> <m:DATA_ITEM>NS_PROC_MW</m:DATA_ITEM> <m:RESOURCE_NAME>AS_SP26_EXP</m:RESOURCE_NAME> <m:OPR_DATE>2010-11-17</m:OPR_DATE> <m:INTERVAL_NUM>1</m:INTERVAL_NUM> <m:VALUE>0</m:VALUE> </m:REPORT_DATA> 

问题是命名空间“http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd”有时可能会有所不同。 我想完全忽略它,只是从标签MessagePayload下游获取我的数据。

我到目前为止使用的代码是:

 String[] namespaces = new String[1]; String[] namespaceAliases = new String[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. String 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.setStripWhitespaceText(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()); 

它的工作正常,如果命名空间永远不会改变,但显然不是这样的。 我需要做什么来使其忽略命名空间? 或者如果我知道所有可能的名称空间值的集合,我怎样才能将它们全部传递给XPath实例?

用途

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

这是常见问题 (但我今天懒得search重复)

在XPath 1.0中

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

select“name”作为本地名称的任何元素。

在XPath 2.0中,您可以使用:

 //*:name