【问题标题】:Java XPath query does not get text in node?Java XPath 查询没有在节点中获取文本?
【发布时间】:2012-05-04 21:03:28
【问题描述】:

当我运行以下代码时,我得到了输出 Left: 而不是 Left: 16

    // Retrieve DOM from XML file
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db;
    Document dom = null;
    try {
        db = dbf.newDocumentBuilder();
        dom = db.parse("config");
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    } catch (SAXException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    XPathFactory xPathFactory = XPathFactory.newInstance();
    XPath xPath = xPathFactory.newXPath();

    try {
        String left = (String) xPath.evaluate(
                "/settings/boundaries[0]/left[0]", dom,
                XPathConstants.STRING);
        System.out.println("Left: " + left);
    } catch (XPathExpressionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

这是 XML 文件

<settings>
    <boundaries>
        <left>16</left>
        <right>301</right>
        <bottom>370</bottom>
        <top>171</top>
    </boundaries>
</settings>

编辑:根据答案,这应该有效,但它没有:

// Retrieve DOM from XML file
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db;
    Document dom = null;
    try {
        db = dbf.newDocumentBuilder();
        dom = db.parse("config");
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    } catch (SAXException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    XPathFactory xPathFactory = XPathFactory.newInstance();
    XPath xPath = xPathFactory.newXPath();

    try {
        String left = (String) xPath.evaluate(
                "/settings/boundaries[0]/left[0]/text()", dom,
                XPathConstants.STRING);
        System.out.println("Left: " + left);
    } catch (XPathExpressionException e) {
        e.printStackTrace();
    }

还要注意这段代码,

Element el = (Element) dom.getDocumentElement()
            .getElementsByTagName("boundaries").item(0);

System.out.println(el.getElementsByTagName("left").item(0));

打印[left: null]

【问题讨论】:

  • 请努力编写更相关/重点突出的标题。

标签: java xml xpath


【解决方案1】:

节点从 1 开始索引。试试/settings/boundaries[1]/left[1]

【讨论】:

  • 这太愚蠢了,但是谢谢。 (我还必须在表达式中添加 /text())。
  • 我希望它在整个编程过程中也是一致的(从零开始的索引)。
【解决方案2】:

您正在使用节点的 toString() 定义。这没有记录在案,特别是做任何事情。如果您希望节点名称使用 XPathConstants.NODE 并使用节点 api,或者如果您希望在评估调用中将值附加 .text() 到您的 xpath 字符串。

【讨论】:

  • 我的表达会不会像这样:“/settings/boundaries[0]/left[0]/text()”?
【解决方案3】:

因为我已经使用它,你必须在末尾添加 /text() 以检索该节点上的数据

/settings/boundaries[0]/left[0]/text()

【讨论】:

  • 看起来这是解决方案的一半
猜你喜欢
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
相关资源
最近更新 更多