2015-01-12 25 views
1

我解析了一個非常大的xml文件(來自jpylyzer,一個jp2屬性提取器)。此XML包含許多JP2圖像的特性,每一個使用相同的元素,如:使用XPathExpression和NODESET評估許多元素

//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只填充了找到的值,這是一個問題:沒有辦法將這些值與其他值匹配,因爲根據找到的屬性數量不同,列表的大小不一樣。

有沒有找到沒有值時填充「空白」的方法?

+0

很容易用XSLT。不熟悉Java;你可以設置除根/文件元素以外的上下文項嗎?您可以將更多路徑表達式應用於表達式計算的nodeList嗎?你可以迭代一個nodeList? –

+0

我可以迭代節點列表。我想我也可以評估。 –

回答

1

你想要的是一個XPath表達式不可能的,即使是2.0版也是如此。在這種情況下,您必須達到您嵌入XPath的更高級別的語言。

由於我對Java非常不熟悉,因此我無法給您具體的代碼,但我可以解釋您所要的做。

我認爲類似

<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文檔,找到一個元素,真正存在於所有的XML文檔,在任何情況下。爲了舉例,假設imageHeaderBox無處不在,但其子height,widthbPCDepth不一定在那裏。

查找XPath表達式爲imageHeaderBox元件:

/results/jpylyzer/properties/imageHeaderBox 

計算表達式並將結果保存到一個節點列表。接下來,進一步處理這個列表。如果這僅適用於XPath表達式可以在nodeList應用於單個項目,但似乎你對此感到樂觀:

我可以在節點列表進行迭代。我想我可以在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 Novatchev的一個解釋答案here。該技術被稱爲Becker方法,可能引入here

最後,結果列表應該類似於

45 
e.g. text saying there is no height 
+0

很好的解釋我會試一試。 (我已經測試過另一種選擇,也許會解釋它..) –