2015-08-18 3 views
1

У меня есть документ XML, из которого я хотел бы получить ключ и значение из этого XML-документа. Однако у меня проблемы с получением обоих, я понимаю, что должен использовать тип данных Карты, но я не уверен, как это сделать.Как получить пару ключевых значений из документа XML Java

Пример:

У меня есть следующий 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; 
} 

Любая помощь или помощь будет высоко ценится, спасибо.

Edit:

Я сделал некоторые исследования, и я нашел то, что будет печатать меня значения, но только 1 из клавиш "Return"

@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 
+0

JAX-B работает хорошо. Это может быть не так быстро, как некоторые другие синтаксические анализаторы, но может быстро встать и работать. –

ответ

0

Функция getChildNodes() https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Node.html#getChildNodes() возвращает нодлист, который содержит дочерние элементы этого узла. Возможно, вы воспользуетесь этой функцией, чтобы пройтись по вашему nodetree. В качестве альтернативы вы можете использовать фреймворки, такие как Jaxb, который отображает ваш xml в Java Pojos. С этой POJOs вы можете построить вашу карту

+0

Пожалуйста, посмотрите мое редактирование, я могу получить значения, а не ключи. Чего не хватает? – mosawi

0

Вы смотрите на java documentation

Прежде всего я попробую с

NodeList nodeList = rootElement.getElementsByTagName("equestqueue"); 

И позже я итерацию через этот список (также посмотреть на API) и найти атрибуты, значения и т. д.

+0

Пожалуйста, посмотрите мое редактирование, я могу получить значения, а не ключи. Чего не хватает? – mosawi

Смежные вопросы