если XML-файл имеет «xmlns», как я могу получить текст из XML-файла, используя XPath - PullRequest
2 голосов
/ 16 августа 2010

Я получаю XML-файл с веб-сайта (http://www.abc.com/),

URL-адрес: http://www.abc.com/api/api.xml

содержимое:

<?xml version="1.0" encoding="utf-8"?>
<root xmlns="http://www.abc.com/">
    <name>Hello!</name>
</root>

имеет xmlns="http://www.abc.com/" вXML-файл,

, теперь я использую JDOM XPath для получения текста Hello!

XPath xpath = XPath.newInstance("/root/name/text()");
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(new URL("http://www.abc.com/api/api.xml"));

System.out.println(xpath.valueOf(doc)); //nothing to print...

Я тестирую, чтобы удалить xmlns="http://www.abc.com/" из XML-файла, это будет работа!

как изменить мой код Java для получения Hello!, если xmlns="http://www.abc.com/" существует?

(я не могу изменить этот XML-файл)

спасибо за помощь:)

Ответы [ 2 ]

2 голосов
/ 16 августа 2010

Вам нужно будет сделать запрос осведомленным о пространстве имен xml.Этот ответ выглядит следующим образом:

Стандартное пространство имен Xml JDOM и XPATH

Вы также можете изменить свой запрос, чтобы использовать local-name, чтобы игнорировать пространства имен:

XPath xpath = XPath.newInstance("/*[local-name() = 'root']");

Это должно вернуть узел с именем root.То есть, если он поддерживает это, и я набрал это правильно!:) Я не знаком с API Java для XML + XPATH.

Имейте в виду, что существуют пространства имен xml, чтобы отличить узел 'root' от любого другого узла с именем 'root'.Так же, как пространства имен класса / пакета.Игнорирование их может привести к конфликту имен.Ваш пробег может варьироваться.

HTH, Зак

1 голос
/ 16 августа 2010

Я не делал этого в последнее время.Но был найден быстрый поиск

http://illegalargumentexception.blogspot.com/2009/05/java-using-xpath-with-namespaces-and.html

, который указывает на использование XPathFactory:

NamespaceContext context = new NamespaceContextMap("http://www.abc.com/" );

Или вы можете использовать ответ Зака ​​и просто игнорировать заданныйпространство имен (если я правильно его понял).Это может привести к проблемам, если на том же уровне иерархии будет больше «корневых» узлов.

...