Получение нулевых значений при попытке проанализировать XML с помощью XPATH в Java - PullRequest
0 голосов
/ 29 сентября 2011

При запуске этого кода в Eclipse я получаю только нулевые значения:

    String recordsAsXML = "<vGVC:Row xmlns:vGVC=\"urn:com.versai:Bacon:GetViewContentsResponse.v1.0\"><vGVC:Column><vGVC:Value>aaa0</vGVC:Value><vGVC:ObjectName>2ff31656-b10c-11e0-99f6-e01321378d2a</vGVC:ObjectName></vGVC:Column><vGVC:ModifiedAfterQuery>false</vGVC:ModifiedAfterQuery></vGVC:Row>";


    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
    domFactory.setNamespaceAware(true);
    DocumentBuilder builder = domFactory.newDocumentBuilder();
    InputSource is = new InputSource();
    is.setCharacterStream(new StringReader(recordsAsXML));

    Document doc = builder.parse(is);

    XPathFactory factory = XPathFactory.newInstance();
    XPath xpath = factory.newXPath();
    XPathExpression expr = xpath.compile("//vGVC:Value/text()");

    Object result = expr.evaluate(doc, XPathConstants.NODESET);
    NodeList nodes = (NodeList) result;

    for (int i = 0; i < nodes.getLength(); i++) {
        System.out.println(nodes.item(i).getNodeValue()); 
    }

Я пытаюсь извлечь значение "aaa0".Не могли бы вы помочь мне понять, что я делаю неправильно?

Заранее спасибо, Михал.

1 Ответ

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

Вы должны использовать контекст пространства имен, чтобы сообщить XPath о вашем пространстве имен, например, так:

xpath.setNamespaceContext(new NamespaceContext() {  
    @Override public Iterator<?> getPrefixes(String namespaceURI) { return null; }
    @Override public String getPrefix(String namespaceURI) { return "vGVC"; }
    @Override public String getNamespaceURI(String prefix) { return "urn:com.versai:Bacon:GetViewContentsResponse.v1.0"; }
});

Это должно быть сделано перед вызовом evaluate, и если у вас есть более одного пространства имен для обработки, вы можете добавить их все в одной реализации и использовать операторы if для возврата правильного префикса / URI.

Подробнее в javadocs здесь: http://download.oracle.com/javase/6/docs/api/javax/xml/namespace/NamespaceContext.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...