我有一个xform文档
<?xml version="1.0" encoding="UTF-8"?><h:html xmlns:h="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jr="http://openrosa.org/javarosa"> <h:head> <h:title>Summary</h:title> <model> <instance> <data vaultType="nsp_inspection.4.1"> <metadata vaultType="metadata.1.1"> <form_start_time type="dateTime" /> <form_end_time type="dateTime" /> <device_id type="string" /> <username type="string" /> </metadata> <date type="date" /> <monitor type="string" /> </data> </instance> </model> </h:head>
我想使用xpath和jdom从xform中选择数据元素
XPath xpath = XPath.newInstance("h:html/h:head/h:title/");
似乎工作正常,并选择title元素,但
XPath xpath = XPath.newInstance("h:html/h:head/model");
不选择模型元素。我想这与名称空间有关。
一些东西。您 确实 应该使用JDOM 2.0.x …(最新版本2.0.5)。2.0.x版本中的XPath API远远优于JDOM 1.x中的XPath API:请参阅https://github.com/hunterhacker/jdom/wiki/JDOM2-Feature- XPath-Upgrade
@wds关于xforms元素也没有正确的名称空间是正确的..这就是您使用XPath的原因,因为它与带有’h’前缀的xhtml元素具有 相同的 名称空间。您的代码很可能仍被破坏。
命名空间的XPath中经常混淆的人,因为 每一个 在XPath命名空间中 有 有一个前缀。即使XML中的默认名称空间(没有前缀,例如’model’元素) 也 必须在XPath中包含。XPath中没有前缀的查询总是引用’no namespace’名称空间…。(XPath规范:http : //www.w3.org/TR/xpath/#node-tests)
使用表达式上下文中的命名空间声明,将节点测试中的QName扩展为扩展名。这与对开始和结束标记中的元素类型名称进行扩展的方式相同,只是不使用通过xmlns声明的默认名称空间:如果QName没有前缀,则名称空间URI为null(这是相同的属性名称的扩展方式)。如果QName的前缀在表达式上下文中没有名称空间声明,则会出错
假设@wds是正确的,并且模型元素的名称空间应该是“ http://www.w3.org/2002/xforms ”,那么文档中的名称空间代号应该是xmlns =“ http:// www。 w3.org/2002/xforms”。但是,此名称空间是“默认”名称空间,并且XPath查询中无前缀名称空间的URI是“”。
要访问XPath中的http://www.w3.org/2002/xforms命名空间,您必须在XPath上下文中为其添加前缀,例如xpns(用于xpath命名空间)。在JDOM 1.x中,您可以使用以下方式添加该名称空间:
XPath xpath = XPath.newInstance("/h:html/h:head/xpns:model"); xpath.addNamespace(Namespace.getNamespace("xpns", "http://www.w3.org/2002/xforms"); Element model = (Element)xpath.selectSingleNode(mydoc)
注意如何将xpns添加到查询中。另外,请注意,我已经将h:/ html引用“锚定”到文档的“ /”根目录,这将提高查询评估的性能。
在JDOM 2.x中,XPath API明显要好得多(即使在某些情况下它似乎有些过分)。
XPathFactory xpf = XPathFactory.instance(); XPathExpression<Element> xpath = xpf.compile("/h:html/h:head/xpns:model", Filters.element(), null, Namespace.getNamesace("xpns", "http://www.w3.org/2002/xforms")); Element model = xpath.evaluateFirst(mydoc);
在JDOM 2.x javadoc中查看有关新XPath API的更多信息:XPathFactory.compile(…)javadoc