我有这样的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
感谢。
答案 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标签。
我希望这对你有用。
答案 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);
}