当前位置: 首页 > 面试题库 >

使用xpath和jdom选择一个节点

麹渊
2023-03-14
问题内容

我有一个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



 类似资料:
  • 问题内容: 我正在使用Selenium IDE进行一些Web应用程序测试,并希望引入一些随机性以扩展我们的测试。我当前正在使用Selenium ,在其中给它一个XPath表达式,它存储与之匹配的第一个元素(排序)。但是我不想存储第一个匹配项,我希望它随机选择一个子节点。 例如 选择此表的所有tr子级。 选择第一个tr(假设现在嵌套表) 选择第三个tr,依此类推。 是否有某种方法(完全在xpath中

  • 如果我有 如果我想选择包含td的a,我该怎么做? 我测试过: 但是我要获得td节点,我要获得a节点。如何使用XPath实现这一点?

  • 从xml中,我需要获得每个节点的名称和面积。 我知道示例xpath,比如,

  • 我是Xpath的新手。 假设我有一个xml目录可以将商品导入电子商店: 目录的第一部分是商品类别列表,第二部分是商品列表。每种商品都有一个<代码> 从上面的代码中,我需要得到这样一个好的描述:类别:夹克;标签:D 标签、颜色和尺寸可直接从<代码> 所以我的目标是选择

  • 如何获取此html片段中a的href值? 我需要根据I标记中的类获取它 我试过了,但没有结果

  • 问题内容: 我只想自行选择一个名为.date的类 由于某种原因,我无法使它正常工作。如果有人知道我的代码出了什么问题,将不胜感激。 问题答案: 我想写这个问题的规范答案,因为上面的答案有问题。 我们的问题 该 CSS 选择器: 将选择具有 foo 类的任何元素。 您如何在XPath中做到这一点? 尽管XPath比CSS强大,但是 XPath没有CSS类选择器的本机等效项 。但是,有一个解决方案。