2

使用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。

谢谢!

4

3 回答 3

1

max()功能在 XPath 1.0 中不可用。

产生想要的(如果有多个节点具有想要的最大属性的第一个)值的纯 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
于 2012-10-25T13:22:05.053 回答
1

试试这个 Xpath 表达式。

max(//data_item/data_report[type = 'My_Type' and entry_number = max(//data_item/data_report[type = 'My_Type']/entry_number)]/value)
于 2012-10-25T03:30:36.367 回答
0

我不知道有任何自动化的方式来做到这一点。我会:
- 解析 xml 以创建 DataReport 对象列表(DOM 可以正常工作)
- 在 DataReport 对象之间创建比较器
- 根据该比较器对列表进行排序

于 2012-10-25T03:27:58.830 回答