Получение пространств имен из элемента в Java (с помощью DOM)

у меня есть следующий пример 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 элемент. Он имеет атрибут пространства имен и, в Java, вам понадобится namespaceURI для получения значения.

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

спасибо.

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

2 ответов


Это может заставить вас начать,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());
            }
        }
    }
}

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

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

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