- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我解析一个非常大的 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
无处不在,但它的子元素 height
、width
和 bPCDepth
不一定存在。
查找 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/
我发现了一个 xsl:key 似乎不起作用的情况。 我正在将 XSLT 1 与 Xalan(已编译)一起使用,这就是正在发生的事情: 1.- 这有效:名为 的 key 测试 1 工作正常:
我正在尝试在 Java 中创建 XPath 表达式(8,默认 XPath 实现)。我正在执行以下操作: Object res = xpath.evaluate("(//*[local-name()='
我正在转换一个 XML 文档。有一个属性@prettydate这是一个类似于“Friday, May 7, 2010”的字符串。我想拆分该字符串并添加指向月份和年份的链接。我正在使用 exslt:st
我一直在阅读关于在文档中选择唯一节点(使用 Muenchian 方法)的不同问题,但在我的情况下我不能使用键(或者我不知道如何使用键),因为我正在处理节点集并且不在文件上。 并且不能在节点集上设置键。
我解析一个非常大的 xml 文件(来自 jpylyzer,一个 jp2 属性提取器)。此 xml 包含许多 JP2 图像的属性,每个图像都具有相同的元素,例如: //results/jpylyzer/
我在 Nokogiri 中使用 XPath 解析从 Google 联系人 API 返回的 XML。 def getcontact doc = Nokogiri::XML.parse(open(ur
我正在使用 Nokogiri 的 xpath 方法寻找我的 input 元素。它返回类 Nokogiri::XML::NodeSet 的对象: [#, #, #, #, #]> 有没有比使用 to_s
我正在尝试在 Memcache 中缓存 Weatherman 的响应 ( https://github.com/dlt/yahoo_weatherman ) 以避免多次获取天气,我正在这样做: w
我拉了一个Nokogiri::XML::NodeSet来自页面,结果如下: 我无法弄清楚如何转换它(对人类来说很明显)标记到 Mechanize/Nokogiri 解析的对象中,这样我就
我正在使用 Crystal,并试图检索 XML 文档中节点的 ID: 我正在使用以下代码获取 ID require "xml" file = File.read("path/to/doc.xml")
我正在使用 R 中的 xml2 包解析一些非常大的 xml 文件。read_xml() 成功加载了大文件,但是当我尝试使用 xml_find_all() 时,我收到“错误:内存分配失败:增长的节点集命
我正在使用 R 中的 xml2 包解析一些非常大的 xml 文件。read_xml() 成功加载了大文件,但是当我尝试使用 xml_find_all() 时,我收到“错误:内存分配失败:增长的节点集命
我试图为 xml 文件中的特定元素设置一个属性,并且我成功地使用了 doc.css('Object').attr("Id").value = timestamp 这很好,直到“对象”不存在导致程序异常
我想按标题值对 Nokigiri 节点集进行排序。尝试了以下代码,但排序不起作用:/有什么建议吗? doc.xpath("//item").sort{|x,y| x.xpath('foo:attr[@
我想从 Nokogiri NodeSet 中获取未转义的内部 html。有谁知道如何做到这一点? 最佳答案 有什么不妥吗? nodeset.inner_html 关于ruby - 如何获取 ruby
我有一个 XmlNodeList,我需要将其设置为一种格式,然后我可以通过从 C# 扩展方法调用它来在 XSLT 样式表中重复使用它。 有人可以帮忙吗?我读到它可能与使用 XPathNavigator
我开始在 w3cschool 学习 xpath。我正在尝试评估游戏中的玩家数量。 (因此计算屏幕名称和 text() 元素/属性) 这是我的示例 xml: My Game
我有一个像这样的颜色元素序列: 还有一个单词序列: 1px Blue Solid 找到 Colors/Color/@name 属性与 Wo
当试图模拟 Faraday::Response对象,我试过: mock(Faraday::Response, :env => {:body => "...some xml..."}) ...但是当我调
我的代码在 Jetty 中工作正常,但一旦在 WebSphere 中部署,我就会收到 java.lang.VerifyError 异常,根本没有任何额外信息(甚至没有消息)。 代码: Class c
我是一名优秀的程序员,十分优秀!