2012-10-25 30 views
2

使用java,我試圖找到最近最高的條目號。這個條目需要指定一個特定的類型。從那裏它需要拉動價值。在未排序的xml文件中查找特定值

這裏的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

您的示例XML文件,什麼預期的輸出? – Jayy

+0

沒有輸出,xml文件是輸入到java程序中的,我只是試圖從xml中根據上述標準提取112354。 –

回答

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 
+0

我實際上結束了一些非常相似的事情對此,我的回答是:// m:REPORT_DATA [not(// m:REPORT_DATA/m:INTERVAL_NUM> m:INTERVAL_NUM)and m:DATA_ITEM ='LMP_PRC'] // m:VALUE/text()(Note ,我的xml文件實際上是http://www.xpathtester.com/saved/f8930d5d-cd32-4fb6-9895-203d82d6ab82,而不是我上面提到的。大多數人被大寫字母/命名空間嚇倒了。 –

+0

另外:This是一個很好的答案,值得注意,它可能會得到更多的關注 –

+0

@ Damien.Bell,這個技術可以在單個XPath表達式中找到最大值,這是衆所周知的,它具有二次時間複雜度,並且會很慢對於長序列,可以使用高效的XSLT 1.0方法來找到最大值。 –

0

我不知道有這樣做的自動方式。我想:
- 解析XML創建數據報表對象的列表(DOM會工作得很好)
- 創建數據報表之間的比較對象
- 以便根據該比較

1

列表試試這個XPath表達式。

max(//data_item/data_report[type = 'My_Type' and entry_number = max(//data_item/data_report[type = 'My_Type']/entry_number)]/value) 
+0

這會遍歷所有現有的data_items嗎? –

+0

@ Damien.Bell是的,它遍歷所有現有的data_items。同樣基於你的評論,我現在已經改變了答案。試試這個,讓我知道 – Jayy

+0

我認爲這會遇到不檢查entry_number最高的問題。 –