2016-12-19 11 views
0

大規模なxmlファイルにsaxパーサーを使用したい。saxの解析 - ネストされたタグをメインタグにマッピング

DefaultHandler handler = new DefaultHandler() { 
String temp; 
HashSet <String> xml_Elements = new LinkedHashSet <String>(); 
HashMap < String, Boolean > xml_Tags = new LinkedHashMap < String, Boolean >(); 
HashMap < String, ArrayList <String>> tags_Value = new LinkedHashMap < String, ArrayList <String>>(); 

//###startElement####### 
public void startElement(String uri, String localName, String qName, 
    Attributes attributes) throws SAXException { 
    xml_Elements.add(qName); 


    for (String tag: xml_Elements) { 
    if (qName == tag) { 
    xml_Tags.put(qName, true); 
    } 
    } 
    } 
    //###########characters########### 
public void characters(char ch[], int start, int length) throws SAXException { 

    temp = new String(ch, start, length); 


    } 
    //###########endElement############ 
public void endElement(String uri, String localName, 
    String qName) throws SAXException { 

    if (xml_Tags.get(qName) == true) { 
    if (tags_Value.containsKey(qName)) { 
    tags_Value.get(qName).add(temp); 
    tags_Value.put(qName, tags_Value.get(qName)); 

    } else { 
    ArrayList <String> tempList = new ArrayList <String>(); 
    tempList.add(temp); 
    //tags_Value.put(qName, new ArrayList<String>()); 
    tags_Value.put(qName, tempList); 
    } 
    //documentWriter.write(qName+":"+temp+"\t"); 
    for (String a: tags_Value.keySet()) { 
    try { 
    documentWriter.write(tags_Value.get(a) + "\t"); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
    } 

    xml_Tags.put(qName, false); 

    } 
    tags_Value.clear(); 

} 

}; 

私のXMLはのようなものです:私は、各AのタグA. すなわち下にあるすべてのネストされたタグをクラスタ化したかった

<TermInfo> 
    <A>1/f noise</A> 
    <B>Random noise</B> 
    <C>Accepted</C> 
    <D>Flicker noise</D> 
    <F>Pink noise</F> 
    <I>1-f</I> 
    <I>1/f</I> 
    <I>1/f noise</I> 
    <I>1:f</I> 
    <I>flicker noise</I> 
    <I>noise</I> 
    <I>pink noise</I> 
    <ID>1</ID> 
</TermInfo> 
<TermInfo> 
    <A>3D printing</A> 
    <B>Materials fabrication</B> 
    <C>Accepted</C> 
    <D>3d printing</D> 
    <F>2</F> 
    <I>three dimension*</I> 
    <I>three-dimension*</I> 
    <I>3d</I> 
    <I>3-d</I> 
    <I>3d*</I> 
</TermInfo> 

...そのB、C、DとIハンドラは次のようになります上記のハンドラを使用すると、出力はABCDIIなどのようになります。それぞれのAに対して1つのオブジェクトを作成し、それに他の要素を追加することはできますか?これをどのように含めることができますか。

答えて

1

私はこれがあなたが求めている行に沿っていると思います。これは、HashMapオブジェクトのListを作成します。 TermInfoを開始するたびに、新しいHashMapが作成されます。 TermInfo内の各endElementは値をMapに挿入します。 endElementがTermInfoの場合、fieldMapをnullに設定して中間タグを追加しません。 "TermInfo"はあなたの説明からAを表します。

public class TestHandler extends DefaultHandler 
{ 
Map<String, String> fieldMap = null; 
List<Map<String, String>> tags_Value = new ArrayList<Map<String, String>>(); 
String temp; 

// ###startElement####### 
public void startElement(String uri, String localName, String qName, 
     Attributes attributes) throws SAXException 
{ 
    if (localName.equals("TermInfo")) // A 
    { 
     fieldMap = new HashMap<String, String>(); 
     tags_Value.add(fieldMap); 
    } 
} 

// ###########characters########### 
public void characters(char ch[], int start, int length) 
     throws SAXException 
{ 

    temp = new String(ch, start, length); 

} 

// ###########endElement############ 
public void endElement(String uri, String localName, String qName) 
     throws SAXException 
{ 
    if (fieldMap != null) 
    { 
     if (!localName.equals("TermInfo")) // A 
     { 
      fieldMap.put(localName, temp); 
     } 
     else 
     { 
      //END of TermInfo 
      fieldMap = null; 
     } 
    } 

} 
+0

ありがとうございました。私はこのソリューションだけのように探していました。ありがとう:) – Kaira

+0

また、qNameにはlocalNameの代わりにqNameを指定しました。qNameから出力が得られました。これらの2つの違いは何ですか? – Kaira

+0

正しく機能していれば正解とマークしてください。 qNameとlocalNameの違いについては、http://stackoverflow.com/questions/7157355/what-is-the-difference-between-localname-and-qnameを参照してください。これは、決して使ったことのない高度なXMLコンセプトです。 – ProgrammersBlock

関連する問題