从Java中的Element中检索命名空间(使用DOM)

Buh*_*ndi 10 java xpath 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>
Run Code Online (Sandbox Code Playgroud)

我关心的是Query元素.它有一个Namespace属性,在java中,你需要一个namespaceURI来检索值.

我的问题是:如何从根元素(在本例中为OpenSearchDescription元素)中检索命名空间列表?我想要我可以用来请求的属性,前缀和名称空间URI Query.

谢谢.

PS:我在java中使用DOM,在Java SE中使用标准.如果有可能的话,我愿意转向XPath.要求是只需要使用Java Standard API.

Ken*_*net 15

这可能会让你开始,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());
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我有类似的代码。问题是始终检查“Node.getNamespaceURI()”返回是否不是“null”。我就是这样检查的。有用。 (2认同)