sax解析 - 将嵌套标签映射到主标签

时间:2016-12-19 11:54:40

标签: java xml sax

我想将sax解析器用于大型xml文件。 Handler看起来像这样:

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就像:

<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>

我想在标签A下聚集所有嵌套标签。 即对于每个A ..它的B,C,D和I在一起..等等。但是使用上面的处理程序,输出就像A-B-C-D-I-I-etc。我可以为每个A创建一个对象并将其他元素添加到其中。我怎么能包括这个......

1 个答案:

答案 0 :(得分:1)

我认为这与你所要求的一致。它创建一个HashMap对象列表。每次启动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;
        }
    }

}