2014-09-12 34 views
0

正在尋找在普通的Java代碼,我們可以HashMap中轉換爲XML和XML使用任何外部庫HashMap來XML語法

任何信息或一些光,將有助於HashMap的

<key1>value1</key1> 
<key2>value2</key2> 

跟了出去。謝謝

+0

你爲什麼不使用像XStream的一個非常適合的庫? – Kostronor 2014-09-12 17:57:26

+1

這不是XML - 它需要一個單一的根級元素才能形成良性。你也確定你的所有密鑰都是合法的xml元素名稱(沒有空格,沒有非法的標點符號,沒有一個以數字開頭,等等)?一個更安全的表示將是' value1' – 2014-09-12 18:27:33

回答

2

下面是一個示例代碼,其中我使用PatternMatcher來查找xml字符串中的鍵和值。

這裏是online demo爲正則表達式模式。

這裏是正則表達式模式的更好的畫面

<([^>]+)>([^<]*)<\/\1> 

Regular expression visualization

Debuggex Demo

我已經使用括號(...)用於分組和\1被用於第一個匹配的組的反向引用。


示例代碼:

String xml = "<key1>value1</key1><key2>value2</key2>"; 

// ------------------------- XML to Map ----------- 

Map<String, String> map = new LinkedHashMap<String, String>(); 
Pattern p = Pattern.compile("<([^>]+)>([^<]*)</\\1>"); 
Matcher m = p.matcher(xml); 
while (m.find()) { 
    map.put(m.group(1), m.group(2)); 
} 

for (Map.Entry<String, String> entry : map.entrySet()) { 
    System.out.println(entry.getKey() + ":" + entry.getValue()); 
} 

// ------------------------- Map to XML ----------- 

StringBuffer buffer = new StringBuffer(); 
for (Map.Entry<String, String> entry : map.entrySet()) { 
    buffer.append("<").append(entry.getKey()).append(">"); 
    buffer.append(entry.getValue()); 
    buffer.append("</").append(entry.getKey()).append(">"); 
} 
System.out.println(buffer); 

輸出:

key1:value1 
key2:value2 
<key1>value1</key1><key2>value2</key2> 

下面是一個使用DOM parser API將XML轉換成地圖好辦法。在Oracle教程中更好地解釋了Reading XML Data into a DOM以及許多很好的示例。

注意:我已經添加了一個根節點,以使其格式良好的xml字符串。

import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.NodeList; 

String xml = "<root><key1>value1</key1><key2>value2</key2></root>"; 

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes())); 

Map<String, String> map = new LinkedHashMap<String, String>(); 
NodeList nodeList = doc.getDocumentElement().getChildNodes(); 
for (int i = 0; i < nodeList.getLength(); i++) { 
    map.put(nodeList.item(i).getNodeName(), nodeList.item(i).getChildNodes().item(0) 
      .getNodeValue()); 
} 

Read more...

+0

感謝Braj,我如上所述,我看到我的xml與<KeyAuditIndicator> < – userJ 2014-09-12 18:06:52

+4

[永遠不會。使用。正則表達式。至。語法分析。 XML。](http://stackoverflow.com/a/1732454/18157) – 2014-09-12 18:07:30

+0

用''替換'<',用'''替換''和'&gp;'或者反過來。 – Braj 2014-09-12 18:07:56

0

對於書面

FileWriter fw = new FileWriter(fileName,false); 
    BufferedWriter buffWriter = new BufferedWriter(fw); 
    for (Map.Entry<String, Object> entry : map.entrySet()) { 
     buffWriter.write("<" + entry.getKey() + ">"); 
     buffWriter.write(entry.getValue()); 
     buffWriter.write("</" + entry.getKey() + ">"); 
     buffWriter.newLine(); 
     // ... 
    } 
    buffWriter.flush(); 
    buffWriter.close();