2016-11-24 5 views
2

XML解析が初めてです。私はDOMとSAXパーサについて読んで、いくつかのサンプルの実装を試みました。しかし、私は以下タグを解析してタグの値属性内にデータを取得する

<?xml version="1.0" ?> 
<collection> 
<action value="submit"/> 
<protocol_version value="1"/> 
<reponse value="Success"/> 
<batch> 
    <sample> 
     <count value="1"/> 
     <count2 value="2"/> 
     <count3 value="3"/> 
    </sample> 
    <sample_2> 
     <date value="10/10/2010"/> 
     <page value="SampleData"/> 
     <track value="123123123"/> 
     <same value="1.00"/> 
     <data> 
      <first_name value="Jeffrey"/> 
      <SSID value="1231231231"/> 
      <last_name value="Chuckle"/> 
      <field1 value="123123123"/> 
      <field2 value="Sam E. Bonzella"/> 
      <field3 value="SOME VALUE"/> 
      <field4 value="SOME VALUE 2"/> 
      <field5 value="TEXT"/> 
      <field6 value="12312"/> 
     </data> 
    </sample_2> 
</batch> 
</collection> 

次のXMLデータを解析することができません、私が実装しようとしたが、それはrepetativeコードを必要とし、また、データが整理されていないサンプルコードです。私もJAXBパーサを試しましたが、value属性を取得できませんでした。

public class test { 
public static void main(String[] args){ 

    try { 
     File inputFile = new File("staff.xml"); 
     DocumentBuilderFactory dbFactory 
       = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document doc = dBuilder.parse(inputFile); 
     doc.getDocumentElement().normalize(); 
     System.out.println("Base :" 
       + doc.getDocumentElement().getNodeName()); 
     NodeList nList = doc.getElementsByTagName("action"); 
     for (int temp = 0; temp < nList.getLength(); temp++) { 
      Node nNode = nList.item(temp); 
      System.out.println("Element :" 
        + nNode.getNodeName()); 
      if (nNode.getNodeType() == Node.ELEMENT_NODE) { 
       Element eElement = (Element) nNode; 
       System.out.println("Action : " 
         + eElement.getAttribute("value")); 
      } 
     } 
     nList = doc.getElementsByTagName("transaction_count"); 
     for (int temp = 0; temp < nList.getLength(); temp++) { 
      Node nNode = nList.item(temp); 
      System.out.println("Element :" 
        + nNode.getNodeName()); 
      if (nNode.getNodeType() == Node.ELEMENT_NODE) { 
       Element eElement = (Element) nNode; 
       System.out.println("transaction_count : " 
         + eElement.getAttribute("value")); 
      } 
     } 


    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

理想的には、データを配列に解析するか、またはマップにすることができます。

答えて

3

getElementsByTagName(String name)は、すべてのタグ名を指定する必要があるため、この場合は役に立ちません。

XMLは、上記の二つのカテゴリーに分類することができる要素が含まれます。値が

  1. 要素を - 私が正しく質問を理解している場合、タグ名と値がマップ値のない

  2. 要素に格納する必要があります。彼らは別の要素を含んでいます。 Tagnameは保存しないでください。

要素は再帰的に解析できます。要素に属性 "value"が含まれている場合は、マップに格納する必要があります。それ以外の場合は、その要素の子ノードをチェックする必要があります。

public static void main(String argv[]) { 

    Map<String, String> map = new LinkedHashMap<>(); 

    try { 
     File fXmlFile = new File("staff.xml"); 
     DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document doc = dBuilder.parse(fXmlFile); 
     doc.getDocumentElement().normalize(); 

     NodeList collectionNodeList = doc.getElementsByTagName("collection"); 
     Element collectionElement = (Element) collectionNodeList.item(0); 
     findElementsWithValues(map, collectionElement); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    System.out.println("Found values: " + map.size()); 
    System.out.println(map); 
} 

private static void findElementsWithValues(Map<String, String> map, Element rootElement) { 
    NodeList childNodes = rootElement.getChildNodes(); 
    for (int i = 0; i < childNodes.getLength(); i++) { 
     Node node = childNodes.item(i); 
     if (node.getNodeType() == Node.ELEMENT_NODE) { 
      Element element = (Element) node; 
      String value = element.getAttribute("value"); 
      if (!value.isEmpty()) { 
       String tagName = element.getTagName(); 
       map.put(tagName, value); 
      }else{ 
       findElementsWithValues(map, element); 
      } 
     } 
    } 
} 

出力

Found values: 19 
{action=submit, protocol_version=1, reponse=Success, count=1, count2=2, count3=3, date=10/10/2010, page=SampleData, track=123123123, same=1.00, first_name=Jeffrey, SSID=1231231231, last_name=Chuckle, field1=123123123, field2=Sam E. Bonzella, field3=SOME VALUE, field4=SOME VALUE 2, field5=TEXT, field6=12312} 
(上記のXMLファイルの修正後は、それが解析可能にするために)
関連する問題