gpt4 book ai didi

xml - 使用 XPath 选择 XML 节点时如何忽略命名空间

转载 作者:数据小太阳 更新时间:2023-10-29 01:37:07 26 4
gpt4 key购买 nike

我必须解析如下所示的 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>

问题是 namespace “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 实例?

最佳答案

这是常见问题解答(但我今天懒得搜索重复项)

在 XPath 1.0 中

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

选择任何以“name”作为local-name的元素。

在 XPath 2.0 中,您可以使用:

//*:name

关于xml - 使用 XPath 选择 XML 节点时如何忽略命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4402310/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com