XPath с использованием JDom - PullRequest
0 голосов
/ 25 июля 2010

В приведенном ниже коде я пытаюсь получить доступ к своим 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);
    }
}
}

Ответы [ 2 ]

1 голос
/ 25 июля 2010

XML-документ, по которому оценивается выражение XPath:

//stp:handler[2]

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

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

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

(//stp:handler)[2]

1 голос
/ 25 июля 2010

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

//handler[2]
...