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

问题描述 投票:0回答:1

我想对大型 XML 文件使用 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就像:

<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 创建一个对象并向其中添加其他元素吗?我怎样才能包含这个?

java xml sax
1个回答
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;
        }
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.