Получение пространства имен из элемента в Java (с использованием DOM) - PullRequest
9 голосов
/ 20 января 2012

У меня есть следующий пример XML:

<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/"
    xmlns:custom="http://example.com/opensearchextensions/1.0/">
    <ShortName>Test</ShortName>
    <Description>Testing....</Description>
    <Url template="whatever" type="what" />
    <Query custom:color="blue" role="example" />
</OpenSearchDescription>

Мое беспокойство связано с элементом Query. Он имеет атрибут Namespace, а в java вам понадобится namespaceURI для получения значения.

Мой вопрос таков: как бы я получил список пространств имен из корневого элемента (в данном случае, элемента OpenSearchDescription)? Я хочу атрибут, префикс и URI пространства имен, которые я могу использовать для запроса на Query.

Спасибо.

PS: я использую DOM в Java, стандарт в Java SE. Я готов перейти на XPath, если это возможно. Требование состоит в том, что должен использоваться только API Java Standard.

Ответы [ 2 ]

15 голосов
/ 20 января 2012

Это может помочь вам начать, factory.setNamespaceAware(true) - это ключ для получения данных пространства имен.

public static void main(String[] args) throws ParserConfigurationException, SAXException,
        IOException
{
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setNamespaceAware(true);
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document doc = builder.parse(new File(args[0]));
    Element root = doc.getDocumentElement();
    //prints root name space
    printAttributesInfo((Node) root);

    NodeList childNodes = root.getChildNodes();
    for (int i = 0; i < childNodes.getLength(); i++)
    {
        printAttributesInfo(childNodes.item(i));
    }
}

public static void printAttributesInfo(Node root)
{
    NamedNodeMap attributes = root.getAttributes();
    if (attributes != null)
    {
        for (int i = 0; i < attributes.getLength(); i++)
        {
            Node node = attributes.item(i);
            if (node.getNodeType() == Node.ATTRIBUTE_NODE)
            {
                String name = node.getNodeName();
                System.out.println(name + " " + node.getNamespaceURI());
            }
        }
    }
}
0 голосов
/ 20 января 2012

Я не знаю, является ли это подходящим способом, но вы могли бы просто взять атрибуты на OpenSearchDescription, выяснить, являются ли они объявлениями пространства имен с помощью констант, расположенных в javax.xml.XMLConstants например. XMLNS_ATTRIBUTE константа должна быть "xmlns". Вы можете просмотреть все атрибуты и сохранить все атрибуты, начиная с этого значения, в качестве NameSpaceUri.

Я думаю, вы также должны взглянуть на NameSpaceContext . Я не знаю, как вы загружаете свой документ, но если вы используете XMLStreamReader, вы можете извлечь из него NameSpaceContext, который содержит именно ту информацию, которая вам нужна. Здесь вы можете увидеть, где вы можете получить NameSpaceContext другими способами.

Надеюсь, это поможет.

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