我有以下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。
答案 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
的位置。
希望有所帮助。