2016-11-22 3 views
-1

Как преобразовать все атрибуты XML в Map из Strings? Мне нужен вывод как ключ и значение в 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

Вы пробовали * ничего *? Существует множество ресурсов, посвященных анализу XML в java. Все, что вам нужно сделать, это найти их. – 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]} 
Смежные вопросы