【发布时间】:2015-08-18 18:43:33
【问题描述】:
我有一个 XML 文档,我想从中检索该 XML 文档的键和值。但是我无法同时获得两者,我意识到我应该使用 Map 的数据类型,但我不确定如何实现这一点。
示例:
我有以下 XML 文件:
<?xml version="1.0"?>
<config>
<Request name="ValidateEmailRequest">
<requestqueue>emailrequest</requestqueue>
<responsequeue>emailresponse</responsequeue>
</Request>
<Request name="CleanEmail">
<requestqueue>Cleanrequest</requestqueue>
<responsequeue>Cleanresponse</responsequeue>
</Request>
</config>
我想写一个方法来解析这个文件并返回一个XML的节点(键)和值(值)的键值对。
如[requestqueue,emailrequest] [responsequeue,emailresponse]等...
我目前拥有的:
public Map<String, String> parseXML(File f) throws Exception {
String xml = FileUtils.readFileToString(f);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new InputSource(new StringReader(xml)));
Element rootElement = document.getDocumentElement();
// I'm stuck...
return null;
}
任何帮助或帮助将不胜感激,谢谢。
编辑:
我做了一些研究,发现了一些可以打印值但只有一个键“返回”的东西
@Test
public void testConverter() throws Exception {
String xml = ("xmlDir/request.xml");
Map<String,String> map = convertNodesFromXml(xml);
for(Map.Entry<String, String> entry: map.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
logger.debug("Key: "+key+" Value: "+value);
}
}
public static Map<String, String> convertNodesFromXml(String xml) throws Exception {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(xml);
Element doc = document.getDocumentElement();
logger.debug(doc.getFirstChild());
return createMap(document.getDocumentElement());
}
public static Map<String, String> createMap(Node node) {
Map<String, String> map = new HashMap<String, String>();
NodeList nodeList = node.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
Node currentNode = nodeList.item(i);
if (currentNode.hasAttributes()) {
for (int j = 0; j < currentNode.getAttributes().getLength(); j++) {
Node item = currentNode.getAttributes().item(i);
map.put(item.getNodeName(), item.getTextContent());
}
}
if (node.getFirstChild() != null && node.getFirstChild().getNodeType() == Node.ELEMENT_NODE) {
map.putAll(createMap(currentNode));
} else if (node.getFirstChild().getNodeType() == Node.TEXT_NODE) {
map.put(node.getLocalName(), node.getTextContent());
}
}
return map;
}
输出:
2015-08-18 15:01:31,651 : Key: Return Value:
136
125
SEPTEMBER
250
OCTOBER
250
125
136
136
125
250
APRIL
136
JUNE
250
125
MAY
136
250
125
136
250
125
JANUARY
136
125
250
MARCH
250
AUGUST
136
125
3000
136
125
250
DECEMBER
136
JULY
125
250
136
125
FEBRUARY
250
1500
555-11-2222
125
136
NOVEMBER
250
1632
1
22000
1
22000
1970-01-01
555-11-2222
CA
【问题讨论】:
-
JAX-B 运行良好。它可能不如其他解析器快,但可以立即启动并运行。
标签: java xml xml-parsing