Сбой разбора XPath с dom4j для текстовой функции - PullRequest
0 голосов
/ 24 сентября 2019

Мой ввод 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);

В идеале он должен вернутьсяme массив items / value / vmdk_file text содержит заданный текст.Однако это дает мне пустую строку.

Я использую dom4j 1.61 и библиотеку версий jaxen 1.1.1.

Что происходит не так?

1 Ответ

0 голосов
/ 25 сентября 2019

Наконец-то после многочасовой отладки выяснили причину неправильного разбора xml.Текстовое значение разбивается на несколько узлов вместо одного узла.Смотрите выделенное изображение

enter image description here

Оказывается, это ошибка в библиотеке dom4j, которая все еще открыта

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

Исправление заключается в вызове document.normalize () для расчета текстовых узлов.

...