在VTD-XML中使用AutoPilot时,XPath评估失败

时间:2015-06-03 14:55:31

标签: java xml xpath xml-namespaces vtd-xml

我有一堆xml包含带有命名空间的元素,我使用VTD-XML来解析那个xml。但是当我尝试使用xpath来获取命名空间元素时。根本不会取的? 这是xml示例

<startQuery logLinkID="797ca6afb7a32458:1619f4f5:14d8fa72127:-7ff5" modelName="SampleModel" tracerString="tracer:: std.Page1.Pane1">
   <xql:XQL xmlns:xql="someNameSpace" cellCountThreshold="1000000" dumpOptions="" enableThresholdDrillDown="false" maxOverridenValueArraySize="" returnFullPath="true" returnNormalizedXql="true">
      <HiddenValues errors="true" nulls="false" zeros="false" />
      <CellAttributes cellsAsAttachment="true" editUEVInfo="false" formattingInfo="false" uevInfo="false" writeBackInfo="true" /></xql:XQL>
</startQuery>

但是当我使用xpath作为

AutoPilot ap = new AutoPilot(nav);
ap.selectXPath("//HiddenValues");

它正常工作但是,当我使用这个xpath

ap.selectXPath("//XQL");

它不起作用。

请帮助我在评估XPath时如何忽略命名空间?

1 个答案:

答案 0 :(得分:2)

我不知道VTD-XML,但看起来你需要声明元素XQL的命名空间。所以在http://vtd-xml.sourceforge.net/javadoc/com/ximpleware/AutoPilot.html快速了解后,我会说:

AutoPilot ap = new AutoPilot(nav);
ap.declareXPathNameSpace("xql", "someNameSpace");
ap.selectXPath("//xql:XQL");

或者如果你想避开后代轴:

AutoPilot ap = new AutoPilot(nav);
ap.declareXPathNameSpace("xql", "someNameSpace");
ap.selectXPath("/startQuery/xql:XQL");

额外提示:如果 startQuery 在另一个命名空间中,只需声明几个前缀(它们不必与输入中的前缀匹配,他们必须匹配的URI):

AutoPilot ap = new AutoPilot(nav);
ap.declareXPathNameSpace("h", "urn:hypotheticalNamespace");
ap.declareXPathNameSpace("xql", "someNameSpace");
ap.selectXPath("/h:startQuery/xql:XQL");

注意:未经测试。