Получение пространств имен из элемента в 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
другими способами.
надеюсь, это поможет.