Java如何使用xpath提取完整的XML块

时间:2017-07-28 12:45:17

标签: java xml xpath

我有这样的XML文件:

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

当C具有特定ID时,我想获得B阻止。例如,如果我想获得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

感谢。

4 个答案:

答案 0 :(得分:1)

谓词只是意味着&#34;只有在尊重我在这个谓词中放入的条件时才保留这个元素&#34;

如此简单,

A/B[C/id = 1]

答案 1 :(得分:0)

您可以通过在xpath查询中使用轴来实现此目的。 正如您所提到的,当C具有特定ID时,您希望获得B阻止。 您必须使用轴进行查询,就像

一样

<强> // * [ID =&#34; 1&#34;] /父:: B

以下是该命令的详细信息。

  

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

     

[id =&#34; 1&#34;] 符合您的要求。

     

/ parent :: B 会将父节点从id标签返回到包含B的B标签。

Demo of the Query

我希望这对你有用。

答案 2 :(得分:0)

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

这是使用Java方法的解决方案,获取C元素,然后获取其父

答案 3 :(得分: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);
}