2017-07-28 36 views
0

提取完整的XML塊我的XML文件是這樣的:的Java如何使用XPath

<A> 
    <B> 
    <C> 
     <id>0</id> 
    </C> 
    </B> 
    <B> 
    <C> 
     <id>1</id> 
    </C> 
    </B> 
</A> 

而且我想獲得B地塊,當C具有特定的ID。例如,如果我想獲得ID = 1塊,我想這個的回覆:

 <B> 
     <C> 
      <id>1</id> 
     </C> 
     </B> 

但我不知道我能得到我想要的一部分。我試過了:

Node result = (Node)xPath.evaluate("A/B/C[id = '1']", doc, XPathConstants.NODE); 

但是,當我想要B塊時返回一個C塊。

和:

Node result = (Node)xPath.evaluate("B[A/B/C[id = '1']]", doc, XPathConstants.NODE); 

返回null。

而且我已閱讀官方文檔,但我沒有發現任何東西:

https://msdn.microsoft.com/en-us/library/ms256471(v=vs.110).aspx

https://msdn.microsoft.com/en-us/library/ms256086(v=vs.110).aspx

感謝。

+0

做'result.getParent()'第一次嘗試,它會給你你想要的C的B;) – azro

+0

謝謝!它也可以工作 –

+0

我已將它添加到答案中,如果需要,可以接受它 – azro

回答

1

謂詞僅僅意味着「只保留這個元素,如果尊重我把這個謂詞條件」

那麼簡單,

A/B[C/id = 1] 
+0

它的工作原理!謝謝! –

0

你可以做到這一點通過使用軸在XPath查詢。正如你所提到的,當C有一個特定的id時,你想獲得B block。 您有父查詢軸就像

// * [ID = 「1」] /父:: B

這裏是命令的細節秒。

// *是直到xpath找到id的嵌套路徑。

[id =「1」]是根據您的要求條件。

/父:: B將從ID標籤返回的父母節點到B標籤,包括B.

Demo of the Query

我希望這會爲你工作。

0
Node result = ((Node)xPath.evaluate("A/B/C[id = '1']", doc, XPathConstants.NODE)) 
                    .getParent(); 

這與Java方法的溶液中,得到一個C元件,然後取它的父

+0

謝謝!有用 –

0

這是代碼,以提取與VTD-XML的文本塊..和XPath。關鍵是使用getElementFragment,它返回源XML文檔中片段的偏移量和長度。

public static void main(String[] args) throws VTDException{ 
    String xml="<A>"+ 
     "<B>\n"+ 
     "<C>\n"+ 
      "<id>0</id>\n"+ 
     "</C>\n"+ 
     "</B>\n"+ 
     "<B>\n"+ 
     "<C>\n"+ 
      "<id>1</id>\n"+ 
     "</C>\n"+ 
     "</B>\n"+ 
    "</A>\n"; 
    VTDGen vg = new VTDGen(); 
    vg.setDoc(xml.getBytes()); 
    vg.parse(false); 
    VTDNav vn = vg.getNav(); 
    AutoPilot ap = new AutoPilot(vn); 
    ap.selectXPath("/A/B[C/id='1']"); 
    System.out.println("====>"+ap.getExprString()); 
    int i=0,count=0; 
    System.out.println(" token count ====> "+ vn.getTokenCount()); 
    while((i=ap.evalXPath())!=-1){ 
     long l = vn.getElementFragment(); 
     System.out.println("fragment content ====>"+ 
       new String(vn.getXML().getBytes(),(int)l,(int)(l>>32))); 
    } 
    System.out.println(" count ===> "+count); 
}