的Java如何使用XPath

问题描述:

提取完整的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

谓词仅仅意味着“只保留这个元素,如果尊重我把这个谓词条件”

那么简单,

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

它的工作原理!谢谢! –

你可以做到这一点通过使用轴在XPath查询。正如你所提到的,当C有一个特定的id时,你想获得B block。 您有父查询轴就像

// * [ID = “1”] /父:: B

这里是命令的细节秒。

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

[id =“1”]是根据您的要求条件。

/父:: B将从ID标签返回的父母节点到B标签,包括B.

Demo of the Query

我希望这会为你工作。

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

这与Java方法的溶液中,得到一个C元件,然后取它的父

+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); 
}