【问题标题】:XPath parsing failing with dom4j for text functiondom4j 文本函数的 XPath 解析失败
【发布时间】:2020-01-24 03:38:00
【问题描述】:

我的输入 xml 是

          String xml=  "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
            "<disks-array>\n" +
              "<array-item>\n" +
               " <value>\n" +
                  "<scsi>\n" +
                   "<bus>0</bus>\n" +
                    "<unit>0</unit>\n" +
                  "</scsi>\n" +
                  "<backing>\n" +
                   "<vmdk_file>[909_TCUP_02] u999orcat017t/u999orcat017t.vmdk</vmdk_file>\n" +
                    "<type>VMDK_FILE</type>\n" +
                  "</backing>\n" +
                  "<label>Hard disk 1</label>\n" +
                  "<type>SCSI</type>\n" +
                  "<capacity>107374182400</capacity>\n" +
                "</value>\n" +
                "<key>2000</key>\n" +
              "</array-item>\n" +
            "</disks-array>"

XPath 过滤器是

"//array-item[contains(./value/backing/vmdk_file/text(),'u999orcat017t/u999orcat017t.vmdk')]"

这是我的解析和过滤代码

        Document doc = DocumentHelper.parseText(xml);

        XPath xp = DocumentHelper.createXPath(xpathQuery);

        // evaluate the xpath
        Object xpResult = xp.evaluate(doc);

理想情况下,它应该返回包含给定文本的数组项 /value/vmdk_file 文本。但是它给了我空字符串。

我正在使用 dom4j 1.61 和 jaxen 1.1.1 版本库。

怎么了?

【问题讨论】:

  • 我试过删除\n?你的 xpath 工作正常
  • 尝试省略/text()。通常,测试元素的字符串值比单独检查其文本节点更可靠。我看不出这里有什么问题,但由于您呈现 XML 的方式,一切可能都不像看起来那样。
  • 我已经修复了xml,它是连接字符串形成xml。

标签: java xpath xml-parsing dom4j


【解决方案1】:

在调试了几个小时后,终于找到了 xml 解析不正确的根本原因。文本值被分成多个节点而不是单个节点。查看突出显示的图片

原来这是 dom4j 库中的一个错误,它仍然处于打开状态

https://github.com/dom4j/dom4j/issues/21

解决方法是调用 document.normalize() 来解决文本节点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    相关资源
    最近更新 更多