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

时间:2012-01-20 09:51:30

标签: java dom xpath

我有以下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元素)中检索命名空间列表?我想要Query上可以用来请求的属性,前缀和名称空间URI。

感谢。

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

2 个答案:

答案 0 :(得分: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());
            }
        }
    }
}

答案 1 :(得分:0)

我不知道它是否是合适的方式,但你可能做的只是取OpenSearchDescription上的属性,在{{1}的常量的帮助下找出它们是否是名称空间声明例如javax.xml.XMLConstants常量应为“xmlns”。您可以遍历所有属性并将所有以该值开头的属性保存为NameSpaceUri。

我想你也应该看一下NameSpaceContext。我不知道您是如何加载文档的,但如果您使用的是XMLNS_ATTRIBUTE,则可以从中检索XMLStreamReader,其中包含您需要的信息。 Here您可以看到以其他方式检索NameSpaceContext的位置。

希望有所帮助。