2017-04-13 178 views
0

由於這個問題的範圍之外的原因,我需要能夠處理同一結構但屬於不同名稱空間的多個xml文檔(don'請問)。XPath - 使用local-name()時根據兄弟節點的值選擇一個節點

要做到這一點,我變得非常習慣使用像我的許多價值選擇以下的XPath:

//*[local-name()='apple']/*[local-name()='flavor']/text()" 

我缺少謂語的理解阻止我基於選擇節點的值兄弟節點的值。考慮下面的XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<fruit> 
    <apple> 
     <kind>Red Delicious</kind> 
     <flavor>starchy</flavor> 
    </apple> 
    <apple> 
     <kind>Granny Smith</kind> 
     <flavor>tart</flavor> 
    </apple> 
    <apple> 
     <kind>Pink Lady</kind> 
     <flavor>sweet</flavor> 
    </apple> 
</fruit> 

比方說,我想寫一個xpath,將選擇一個格蘭尼史密斯蘋果的味道。雖然我通常會做這樣的事情:

//apple[kind/text()='Granny Smith']/flavor/text() 

我無法弄清楚如何合併利用當地名的概念()是不可知的命名空間,同時還選擇基於兄弟姐妹的值的節點。

簡而言之,無論輸入fruit xml文檔屬於哪個命名空間,返回「tart」所需的xpath是什麼?

+0

我並不完全確定自己明白,但//*[contains(.,'tart')]是我認爲你正在尋找的東西。更具體地說,雖然:// apple [contains(@flavor,'tart')]會返回有問題的蘋果,假設有其他的水果也可能具有標記名味兒。 –

+0

我想要這個xpath的等價物,這個名稱空間是無知的,並且可以用於任何水果xml,而不管它屬於哪個名稱空間(只要結構在上面):// apple [kind/text()='Granny Smith']]/flavor/text()讓我們假設我們不知道什麼味道是爲了參數 – Russ

+0

我想我現在明白了。我可以告訴你,如果它有幫助,我將如何在Java中實現它:「// * [local-name()='type']/* [local-name()='property'] /../ name )= '輸出'] /文本()」。替換( 「類型」, 「蘋果屬性 」 「類型的輸出 」 「味道」)「)替換(」。「)替換(」; (air-code,未經測試) –

回答

0

我需要能夠處理相同 結構的多個XML文檔,但屬於不同的命名空間(不要問)

我來處理,這是先轉換數據首選方式使用單個名稱空間,然後進行適當的轉換。這樣做(a)使真正的轉換更加簡單,(b)將所有名稱空間轉換邏輯放在一個位置,並且(c)使命名空間轉換邏輯可重用 - 您可以使用相同的轉換,而不管數據如何隨後使用。

相關問題