【发布时间】:2014-03-12 18:38:55
【问题描述】:
我正在构建一个基于 VTD 的 XML 解析引擎,以便处理来自多个输入系统的文件。
我目前正在尝试从带有命名空间前缀的标签中获取值:
<?xml version="1.0" encoding="UTF-8"?>
<cli:clients xmlns declarations >
<cli:client>
<dat:name>CLIENT NAME</dat:name>
<dat:age>1</dat:age>
</cli:client>
并查询以下 Xpath:
//client/age/text()
//client/name/text()
如何设置 VTD AutoPilot 以忽略命名空间前缀?
注意:我无法更改 xpath,因为我已经在生产中使用 JDK 的默认 xpath 引擎实现了这个引擎。
更新:见下面我用来测试的代码。文件与上面的类似:
@Test
public void doFile() throws Exception {
byte[] xmlData = FileUtils.loadFile("namespace-test.xml");
VTDGen gen = new VTDGen();
gen.setDoc(xmlData);
gen.parse(false);
VTDNav vtd = gen.getNav();
AutoPilot pilot = new AutoPilot(vtd);
pilot.selectXPath("//clients");
int re = pilot.evalXPath();
System.out.println(re);
if (re >= 0) {
System.out.println(vtd.toString(re));
}
}
【问题讨论】:
-
如果你不能改变XPaths,那么正如我们在波士顿所说的,你可能是一条年轻的鳕鱼——即scrod。正常的建议是向 XPath 添加一个前缀并告诉 XPath 引擎该前缀绑定到哪个名称空间,或者(丑陋,不推荐,但会工作)将 XPath 重写为通配符,带有显式测试本地名称的谓词。
-
如果您继续使用 vtd-xml.sf.net 并从 cvs 中查看最新的 vtdNav.java,您应该可以像 DOM 一样使用它...需要更多说明
-
@vtd-xml-author,它是否在最新版本的 VTD-XML Java 实现上工作?我正在使用 com.ximpleware:vtd-xml:2.11 (java 版本)
-
这仅在 2.12 中可用,但您现在可以通过下载它然后构建一个新的 tar 文件来获得它。
标签: java xml xml-parsing xml-namespaces vtd-xml