我有一个文件的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>
我想选择从XForm中使用XPath和JDOM数据元素
XPath xpath = XPath.newInstance("h:html/h:head/h: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的更好:看https://github.com/hunterhacker/jdom/wiki/JDOM2-Feature-XPath-Upgrade
@wds是对有关不具有针对XForms元素太正确的命名空间....这就是为什么你的XPath工作,因为它具有相同的命名空间与“H”字头的XHTML元素。 您的代码很可能仍然是断开的。
在XPath的命名空间经常混淆的人,因为在XPath 每个命名空间必须有一个前缀。 即使事情是在XML的默认命名空间(没有前缀喜欢你的“模型”元素),它必须有一个在XPath。 与在XPath没有前缀查询始终引用“无命名空间”命名空间....(XPath规范: http://www.w3.org/TR/xpath/#node-tests )
在节点测试的QName是使用命名空间声明从表达式上下文扩展成一个扩展名。 这是相同的方式扩张是除了与的xmlns声明默认命名空间不应用于开始元素类型名称和结束标记做:如果的QName没有前缀,则命名空间URI为空(这是相同的方式属性名被扩展)。 这是一个错误,如果有的QName前缀为没有在表达方面没有命名空间声明
假设@wds是正确的,并为模型元素的命名空间应该是“ http://www.w3.org/2002/xforms ”那么你的文档中的命名空间delcaration应的xmlns =“HTTP:// WWW。 w3.org/2002/xforms”。 但是,这个命名空间是“默认”的命名空间,并在你的XPath查询的URI没有前缀命名为“”。
要访问http://www.w3.org/2002/xforms在你的XPath命名空间,你必须给它一个前缀FO中的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是significanty更好(即使在某些情况下,它可能看起来矫枉过正)。
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中的JDOM的javadoc 2.X: XPathFactory.compile(...)的javadoc