У меня есть метод (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.