2016-11-22 117 views
-1

如何将XML的所有属性转换为StringsMap?我需要在Map中输出作为键和值。即Map<String, String>如何将xml字符串转换为映射<String,String>

<persons xmlns="http://www.sample.com/restapi" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <delivery></delivery> 
    <Order>1</Order> 
    <person1> 
     <personorder> 
      <email>[email protected]</email> 
      <name>Smith </name> 
      <data> 
       <approvedata> 
        <approve> 
         <Label>Consent</Label> 
         <underline>false</underline> 
        </approve> 
       </approvedata> 
      </data> 
     </personorder> 
    </person1> 
    </persons> 



    output : 
............................... 
     Order,1 
     email,[email protected] 
     Label,Consent 
+0

井,这可能是不可能的,因为想象有2个人物。现在,我们需要将这个人的电子邮件存储在一个名称下。因此,该人的电子邮件中的一个始终会被覆盖。你想如何处理这种情况?我的意思是预期的产出? –

+0

你试过*什么*?有很多资源涉及解析Java中的XML。你所要做的就是搜索它们。 – tnw

+0

可能重复? http://stackoverflow.com/questions/1537207/how-to-convert-xml-to-java-util-map-and-vice-versa –

回答

0

我是能够实现使用XPath的解决方案。 xpath查询搜索具有任何文本的叶元素。然后一个简单的循环将xpath结果NodeList转换为Map。

这里是包裹在一种方法中,溶液:

public static Map<String, String> getElementsWithText(Document xmlDoc) throws XPathException 
{ 
    Map<String, String> elementsWithText = new HashMap<>(); 

    final String leafElementsWithTextXPathQuery = "//*[not(child::*) and text()]"; 
    XPath xPath = XPathFactory.newInstance().newXPath(); 
    NodeList list = (NodeList)xPath.compile(leafElementsWithTextXPathQuery) 
     .evaluate(xmlDoc, XPathConstants.NODESET); 
    for (int i = 0; i < list.getLength() ; i++) { 
     Node node = list.item(i); 
     elementsWithText.put(node.getNodeName(), node.getTextContent()); 
    } 
    return elementsWithText; 
} 

下面是测试主加载从问题的XML:

public static void main(String[] args) 
{ 
    try { 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     Document xmlDoc = builder.parse(new InputSource(new FileReader("C://Temp/xx.xml"))); 
     System.out.println(getElementsWithText(xmlDoc)); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

输出从println

{Order=1, underline=false, name=Smith , Label=Consent, [email protected]} 
相关问题