我有一个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");不选择模型图元。我猜这与命名空间有关。
发布于 2013-05-01 18:38:40
几件事。您确实应该使用JDOM 2.0.x ... (2.0.5是最新版本)。2.0.x版本中的JDOM比XPath 1.x中的要好得多:请参阅https://github.com/hunterhacker/jdom/wiki/JDOM2-Feature-XPath-Upgrade
@wds没有为xforms元素提供正确的命名空间,这是正确的……这就是为什么XPath可以工作,因为它与带有'h‘前缀的xhtml元素具有相同的名称空间。你的代码很可能仍然会被破坏。
XPaths中的名称空间经常让人感到困惑,因为XPath中的每个名称空间都必须有一个前缀。即使某些东西是XML中的默认名称空间(没有像‘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"。但是,此命名空间是”default“命名空间,并且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)注意这是如何将xpn添加到查询中的。另外,请注意,我已经将h:/html引用“锚定”到文档的“/”根,这将提高查询计算的性能。
在JDOM2.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);有关新的XPath API的更多信息,请参阅JDOM2.x javadoc:XPathFactory.compile(...) javadoc
https://stackoverflow.com/questions/16315378
复制相似问题