使用java,我正在尝试查找最新的最高条目号。此条目需要指定特定类型。从那里它需要拉动价值。
这是xml的样子
<XmlFile>
<data_item>
<data_report>
<type>My_Type</type>
<entry_number>12</entry_number>
<value>1234</value>
</data_report>
<data_report>
<type>My_Type</type>
<entry_number>9</entry_number>
<value>11234</value>
</data_report>
</data_item>
<data_item>
<data_report>
<type>My_Type</type>
<entry_number>17</entry_number>
<value>112354</value>
</data_report>
<data_report>
<type>Not_My_Type</type>
<entry_number>122</entry_number>
<value>11234</value>
</data_report>
</data_item>
</XmlFile>
所以关键是我需要的数据是“My_Type”它可以在任何data_item中,但它需要找到my_type的所有项目中的最大间隔,仅拉取值。
我已经尝试过使用Xpath,但我无法让它工作。在这种情况下,第三个数据报告(在第二个数据项中)将是我之后的那个,因为它具有最高的条目号,同时是“我的类型”所以我希望程序为我获取数字112354。
有没有办法用Xpath做到这一点?我试图让它工作的文件比这大得多,但Xpath似乎是最简单的选择,如果那些更适合我,我不反对DOM或SAX。
谢谢!
答案 0 :(得分:1)
试试这个Xpath表达式。
max(//data_item/data_report[type = 'My_Type' and entry_number = max(//data_item/data_report[type = 'My_Type']/entry_number)]/value)
答案 1 :(得分:1)
XPath 1.0中没有max()
函数。
生成所需的纯XPath表达式(如果有多个具有所需最大属性的节点,则为第一个):
string(
/*/*/*[type='My_Type'
and
not(/*/*/*[type='My_Type']/entry_number > entry_number)
][1]/value
)
基于XSLT的验证:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:copy-of select=
"string(
/*/*/*[type='My_Type'
and
not(/*/*/*[type='My_Type']/entry_number > entry_number)][1]/value
)"/>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<XmlFile>
<data_item>
<data_report>
<type>My_Type</type>
<entry_number>12</entry_number>
<value>1234</value>
</data_report>
<data_report>
<type>My_Type</type>
<entry_number>9</entry_number>
<value>11234</value>
</data_report>
</data_item>
<data_item>
<data_report>
<type>My_Type</type>
<entry_number>17</entry_number>
<value>112354</value>
</data_report>
<data_report>
<type>Not_My_Type</type>
<entry_number>122</entry_number>
<value>11234</value>
</data_report>
</data_item>
</XmlFile>
评估XPath表达式并将此评估结果复制到输出:
112354
答案 2 :(得分:0)
我不知道有任何自动执行此操作的方法。我会:
- 解析xml以创建DataReport对象列表(DOM将正常工作)
- 在DataReport对象之间创建比较器
- 根据比较器订购您的清单