Не удается извлечь элемент значения XML с помощью JDOM & Xpath - PullRequest
1 голос
/ 03 сентября 2011

У меня есть метод (getSingleNodeValue ()), который при передаче выражения xpatch извлекает значение указанного элемента в документе xml, на который ссылаются в 'doc'.Предположим, что документ на этом этапе был инициализирован, как показано ниже, и xmlInput - это буфер, содержащий содержимое XML.

SAXBuilder  builder     =   null;
Document    doc     =   null; 
XPath       xpathInstance   =   null;

doc = builder.build(new StringReader(xmlInput));

Когда я вызываю метод, я передаю следующее выражение xpath

/TOP4A/PERLODSUMDEC/TINPLD1/text()

Вот метод.В основном он просто берет буфер XML и использует xpath для извлечения значения:

public static String getSingleNodeValue(String xpathExpr) throws Exception{

    Text list = null;

    try {
        xpathInstance = XPath.newInstance(xpathExpr);
        list = (Text) xpathInstance.selectSingleNode(doc);
    } catch (JDOMException e) {
        throw new Exception(e);
    }catch (Exception e){
        throw new Exception(e);
    } 

    return list==null ? "?" : list.getText();
}

Приведенный выше метод всегда возвращает "?"то есть ничего не найдено, поэтому «список» является нулевым.XML-документ, на который он смотрит:

<TOP4A xmlns="http://www.testurl.co.uk/enment/gqr/3232/1">    
  <HEAD>
    <Doc>ABCDUK1234</Doc>  
  </HEAD>    
  <PERLODSUMDEC>
    <TINPLD1>10109000000000000</TINPLD1>
  </PERLODSUMDEC>
</TOP4A>

Тот же метод работает с другими XML-документами, поэтому я не уверен, что особенного в этом.Исключений нет, поэтому xml является действительным xml.Просто метод всегда устанавливает «список» в нуль.Любые идеи?

Редактировать

Хорошо, как и предлагалось, вот простая запущенная программа, которая демонстрирует выше

import org.jdom.*;
import org.jdom.input.*;
import org.jdom.xpath.*;

import java.io.IOException;
import java.io.StringReader;

public class XpathTest {


    public static String getSingleNodeValue(String xpathExpr, String xmlInput) throws Exception{

        Text list = null;
        SAXBuilder  builder         =   null;
        Document    doc             =   null; 
        XPath       xpathInstance   =   null;

        try {
            builder = new SAXBuilder(); 
            doc     = builder.build(new StringReader(xmlInput));

            xpathInstance = XPath.newInstance(xpathExpr);
            list = (Text) xpathInstance.selectSingleNode(doc);
        } catch (JDOMException e) {
            throw new Exception(e);
        }catch (Exception e){
            throw new Exception(e);
        } 

        return list==null ? "Nothing Found" : list.getText();
    }

    public static void main(String[] args){

        String xmlInput1 = "<TOP4A xmlns=\"http://www.testurl.co.uk/enment/gqr/3232/1\"><HEAD><Doc>ABCDUK1234</Doc></HEAD><PERLODSUMDEC><TINPLD1>10109000000000000</TINPLD1></PERLODSUMDEC></TOP4A>";
        String xpathExpr = "/TOP4A/PERLODSUMDEC/TINPLD1/text()";

        XpathTest xp = new XpathTest();
        try {
            System.out.println(xp.getSingleNodeValue(xpathExpr, xmlInput1));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Когда я запускаю выше, вывод

Nothing found

Редактировать

Я провел дополнительное тестирование, и кажется, что, если я удаляю URL-адрес пространства имен, он работает.Пока не знаю, почему.Можно ли как-то сказать ему игнорировать пространство имен?

Редактировать

Обратите также внимание, что вышеперечисленное реализовано в JDK1.4.1, поэтому у меня нет вариантов для более поздней версии JDK.,Это причина, почему я должен был придерживаться Jdom.

1 Ответ

2 голосов
/ 03 сентября 2011

Проблема в пространствах имен XML: ваш запрос XPath начинается с выбора элемента «TOP4A» в пространстве имен по умолчанию. Однако в вашем XML-файле есть элемент TOP4A в пространстве имен http://www.testurl.co.uk/enment/gqr/3232/1'.

Есть ли возможность удалить xmlns из XML?

...