gpt4 book ai didi

java - 使用 XPathExpression 和 NODESET 评估许多元素

转载 作者:太空宇宙 更新时间:2023-11-04 06:17:29 25 4
gpt4 key购买 nike

我解析一个非常大的 xml 文件(来自 jpylyzer,一个 jp2 属性提取器)。此 xml 包含许多 JP2 图像的属性,每个图像都具有相同的元素,例如:

//results/jpylyzer/fileInfo/fileName
//results/jpylyzer/properties/jp2HeaderBox/imageHeaderBox/height
//results/jpylyzer/properties/jp2HeaderBox/imageHeaderBox/width
//results/jpylyzer/properties/jp2HeaderBox/imageHeaderBox/bPCDepth

为了减少处理时间,我使用这种方法:

for (XPathExpression xPathExpression : listXPathExpression) {
nodeList = (NodeList) xPathExpression.evaluate(document, XPathConstants.NODESET);
//we use our list
}

这非常方便快捷,但是元素的数量必须符合我们对每个属性的预期。由于某些属性是某些图像所独有的,因此某些图像无法找到某些 xpath 值。

nodeList 仅填充找到的值,这是一个问题:无法将这些值与其他值匹配,因为列表的大小不同,具体取决于找到的属性数量。

当没有找到值时,有没有办法填充“空白”?

最佳答案

使用单个 XPath 表达式无法实现您想要的效果,即使使用 2.0 版本也是如此。在这种情况下,您必须使用嵌入 XPath 的高级语言。

由于我对Java不太熟悉,所以我无法给你具体的代码,但我可以解释你必须做什么。

我假设一个 XML 文档类似于

<results>
<jpylyzer>
<fileInfo>
<fileName>Name of file</fileName>
</fileInfo>
<properties>
<jp2HeaderBox>
<imageHeaderBox>
<height>45</height>
<width>66</width>
<bPCDepth>386</bPCDepth>
</imageHeaderBox>
<imageHeaderBox>
<width>32</width>
</imageHeaderBox>
</jp2HeaderBox>
</properties>
</jpylyzer>
</results>

作为起点,找到一个在所有情况下都确实存在于所有 XML 文档中的元素。举个例子,我们假设 imageHeaderBox 无处不在,但它的子元素 heightwidthbPCDepth 不一定存在。

查找 imageHeaderBox 元素的 XPath 表达式:

/results/jpylyzer/properties/imageHeaderBox

计算表达式并将结果保存到节点列表中。接下来,进一步处理这个列表。仅当 XPath 表达式可以应用于 nodeList 中的各个项目时,这才有效,但您似乎对此持乐观态度:

I can iterate over nodelist. I guess i can evaluate too

迭代nodeList(imageHeaderBox表达式的结果)并对每个项目应用另一个路径表达式。

XPath 2.0

在 XPath 2.0 中,您可以使用 if/then 语句来检查节点是否存在。假设 imageHeaderBox 元素节点作为上下文项:

if(height) then height else 'e.g. text saying there is no height'

XPath 1.0

对于 XPath 1.0,情况稍微复杂一些:

concat(height, substring('e.g. text saying there is no height', 1 div not(height)))"

参见 Dimitre Novatev 的回答 here以获得解释。该技术被称为 Becker 方法,可能介绍 here .

最后,结果列表应类似于

45
e.g. text saying there is no height

关于java - 使用 XPathExpression 和 NODESET 评估许多元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27899224/

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