Как выбрать XML-узел «namespaced» с помощью org.w3c.dom.Node.getNamedItemNS (nsUri, name)? - PullRequest
1 голос
/ 31 июля 2010

Это xml:

<xml xmlns:log="http://sample.com">

  <test log:writer="someWriter" />

</xml>

Я пытаюсь получить значение атрибута "log: writer", используя следующую строку кода:

currentNode.getAttributes().getNamedItemNS("log", "writer")

Я также пытался разместить объявление xmlns: log = "http://sample.com" на узле" test ", но всегда получаю NullPointerException. DocumentBuilderFactory, используемый для Document, также имеет setNamespaceAware включен. Любая подсказка?

1 Ответ

4 голосов
/ 31 июля 2010

getNamedItemNS принимает namespaceURI в качестве первого параметра (т. Е. http://sample.com), а не префикс (log).

Редактировать:

Вот тестдело в полном объеме.Это печатает «Значение атрибута someWriter».Протестировано с использованием Xerces в качестве библиотеки XML.Это работает для вас?

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

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;


public class GetNamedItemNSTester
{
    public static void main(String[] args)
    {
        new GetNamedItemNSTester();     
    }

    String xml = "<xml xmlns:log=\"http://sample.com\">\n" +
            "\n" +
            "<test log:writer=\"someWriter\" />\n" +
            "\n" +
            "</xml>";


    public GetNamedItemNSTester()
    {
        StringReader xmlReader = new StringReader(xml);
        try
        {
            DocumentBuilderFactory factory =
                DocumentBuilderFactory.newInstance();
            factory.setNamespaceAware(true);
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(new InputSource(xmlReader));

            Element currentNode =
                (Element)doc.getElementsByTagName("test").item(0);
            String attributeValue = currentNode.getAttributes()
                .getNamedItemNS("http://sample.com", "writer").getNodeValue();
            System.out.println("Attribute value is " + attributeValue);
        }
        catch (ParserConfigurationException e)
        {
            e.printStackTrace();
        }
        catch (SAXException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            xmlReader.close();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...