XPath с использованием JDom

В приведенном ниже коде я пытаюсь получить доступ к XML-элементам «обработчика» с помощью XPath, но мне не повезло — элемент «elemHandler» всегда равен нулю. Может ли кто-нибудь поделиться со мной очевидным решением? Заранее спасибо.

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

import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;

public class XPathTest {
    private static String jobString = "<job name=\"Workflow.JOB\">" + 
                                           "  <handler name=\"xslt.converter\"/>" +
                                           "  <handler name=\"openoffice.renderer\">" +
                                           "    <opts input=\"ODS\" output=\"PDF\"/>" +
                                           "  </handler>" +
                                           "</job>";

    public static void main(String[] args) {
    try {
        Element elemJobInfo = new SAXBuilder().build(new StringReader(jobString)).detachRootElement();
        XPath handlerExpression = XPath.newInstance("//stp:handler[2]");
        handlerExpression.addNamespace("stp", "http://service.mine.org/dgs");
        Element elemHandler = (Element) handlerExpression.selectSingleNode(elemJobInfo);
        jobString = elemHandler.toString();
    }
    catch (IOException e) {
        System.out.println("Failure: " + e);
    }
    catch (JDOMException e) {
        System.out.println("Failure: " + e);
    }
    catch (Exception e) {
        System.out.println("Failure: " + e);
    }
}
}

person user5257774    schedule 24.07.2010    source источник


Ответы (2)


Что случилось с пространством имен stp? XML в jobString не ссылается ни на какие пространства имен. Пробовали без префикса?

//handler[2]
person John Kugelman    schedule 24.07.2010
comment
Да. Исследования показывают, что XPath не работает с неполным пространством имен и/или пространством имен по умолчанию. Вы должны предоставить один. - person user5257774; 25.07.2010
comment
XPath действительно работает с пространством имен по умолчанию. Единственная проблема с пространством имен, о которой я знаю, заключается в том, что она не учитывает объявления xmlns="some-uri". Если вы измените пустой префикс в своем документе, XPath проигнорирует его; для элементов, не входящих в пространство имен по умолчанию, требуется префикс пространства имен. Например, вы не можете использовать /html для соответствия <html xmlns="http://www.w3.org/..."> в документе XHTML. - person John Kugelman; 25.07.2010

Документ XML, для которого выражение XPath:

//stp:handler[2]

оценивается, не имеет пространств имен по умолчанию или объявленных, и все узлы находятся в «без пространства имен». В пространстве имен "http://service.mine.org/dgs" нет ни одного узла. Если вы не используете другой XML-документ в вашем реальном случае, приведенное выше выражение не должно выбирать какой-либо узел — и это именно то, что вы получаете.

Если вы используете не показанный документ, который действительно имеет пространство имен по умолчанию, скорее всего, вы допустили ошибку в написании пространства имен в своем коде Java.

Кроме того, попробуйте этот вариант выражения XPath (с префиксом пространства имен или без него):

(//stp:handler)[2]

person Dimitre Novatchev    schedule 24.07.2010
comment
Спасибо Димитре. Я попробовал этот вариант, и он не сработал. На данный момент я испробовал множество вариантов, включая полный интервал имен XML-документа и т. д. На каких бы форумах я ни публиковал это до сих пор, все, кроме вас, похоже, больше заинтересованы в интеллектуальной битве, чем в том, чтобы получить что-то, что работает. Я очень хочу, чтобы кто-нибудь взял фрагмент кода, взял jdom.jar и jaxen.jar и рассказал мне, как это должно работать на самом деле. - person user5257774; 25.07.2010
comment
@topsquire: К сожалению, я не работаю с Java. Если бы это был C# или MSXML DOM, я бы смог помочь. Кажется, это не вопрос XPath, потому что в любой другой среде выражения без пространства имен будут выбирать узлы. Скорее всего, вы не используете Java XPath API по мере необходимости. Пожалуйста, обратитесь к доступной документации - обычно она содержит примеры, которым вы можете следовать. Кроме того, вы можете задать вопрос на форуме, связанном с Java. Я могу доказать вам, какие узлы выбираются конкретными выражениями XPath, оценив их в среде, где XSLT является языком, на котором работает XPath. - person Dimitre Novatchev; 25.07.2010