【问题标题】:Not able to extract desired attribute value from a tag using XPath无法使用 XPath 从标签中提取所需的属性值
【发布时间】:2018-11-02 16:40:01
【问题描述】:

我有一个如下所示的 XHTML:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta name="sample" content="Just for sample"/>
    <title/>
  </head>
  <body>
    <h1>Sample Heading</h1>
    <p align="left">XHTML and HTML are relatives.<a href="http://www.google.com">Google</a>
    </p>
  </body>
</html>

我想使用 Java 中的 XPath 表达式从 &lt;p&gt; 中提取 align 的属性值。所以,我尝试使用这段代码:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);


DocumentBuilder builder = factory.newDocumentBuilder();
    Document doc = builder.parse("TestFile.xhtml");

//Create XPath

XPathFactory xpathfactory = XPathFactory.newInstance();
XPath Inst= xpathfactory.newXPath();
NodeList nodes = (NodeList)Inst.evaluate("//p/@align",doc,XPathConstants.NODESET);
    for (int i = 0; i < nodes.getLength(); ++i) 
   {
            Element e = (Element) nodes.item(i);
            System.out.println(e);
    }

在 Java 代码中。但我没有得到任何输出。即使我只写//body,也不会提取任何内容。谁能告诉我我在这里做错了什么?对代码进行任何编辑都会有所帮助。

【问题讨论】:

    标签: java xpath xhtml


    【解决方案1】:

    在您的 XHTML 中没有名为 p 的元素,尽管它可能看起来如此。

    当您在 XML 中使用 xmlns 属性时,您声明带有该属性的元素以及所有后代元素都在该命名空间中(除非被其他命名空间声明显式覆盖)。

    因此,根元素没有命名为html,它实际上是“http://www.w3.org/1999/xhtml”命名空间中的 html。html 部分称为“本地部分”。本地名称和命名空间 URI 统称为 QName

    按照惯例,这是通过将命名空间 URI 放在大括号中作为前缀来编写的,因此为了便于讨论,根元素是 {http://www.w3.org/1999/xhtml}html,而您要查找的元素是 {http://www.w3.org/1999/xhtml}p

    处理这个问题的一种方法是install a NamespaceContext,但由于我一直难以理解的原因,Java SE 没有 NamespaceContext 的公共标准实现,这使得设置它成为一件苦差事。

    一种更简单的方法是定制 XPath 表达式以仅根据每个元素的本地部分搜索元素:

    Inst.evaluate("//*[local-name()='p']/@align", doc, XPathConstants.NODESET);
    

    如果您使用的是DocumentBuilderFactory,请记住在创建 DocumentBuilder 之前对其调用setNamespaceAware(true)

    【讨论】:

    • 其实我用过DocumentBuilderFactory并设置了setNamepaceAware(true)。我已经编辑了我的问题以提供更多代码 sn-p。所以,你的意思是即使你把setNamespaceAware设置为true,我还需要加上[local-name()='p']
    • 是的。单独p 将查找具有“p”的本地部分和空命名空间 URI 的元素。
    • 好的,这就回答了我的主要问题。谢谢!我会将答案标记为已接受。
    猜你喜欢
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 2013-04-06
    • 2021-12-07
    相关资源
    最近更新 更多