Java SAX ContentHandler为每个根节点创建新对象

时间:2010-03-15 07:00:07

标签: java xml sax

我正在使用SAX来解析一些XML。假设我有以下XML文档:

<queue>
   <element A> 1 </element A>
   <element B> 2 </element B>
</queue>
<queue>
   <element A> 1 </element A>
   <element B> 2 </element B>
</queue>
<queue>
   <element A> 1 </element A>
   <element B> 2 </element B>
</queue>

我还有一个Elements类:

public static Elements {

  String element;

  public Elements() {

  }

  public void setElement(String element){
     this.element = element;
  }

  public String getElement(){
     return element;
  }

}

我希望编写一个遵循以下算法的ContentHandler:

Vector v;
for every <queue> root node {
   Element element = new Element();

   for every <element> child node{
      element.setElement(value of current element);
   }
   v.addElement(element);
}

所以,我想创建一堆Element对象并将每个对象添加到一个向量中......每个Element对象都包含自己的String值(来自根节点中的子节点。

我知道如何解析元素和所有这些细节,但有人可以向我展示如何构建我的ContentHandler以允许上述算法的示例吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

您无法按照建议使用循环编写处理程序。它实际上是基于事件的,因此您需要在处理程序中自己跟踪currentQueuecurrentElement。还要注意每个标签可能会多次调用characters(关于这一点还有其他问题)。

所以这是一个非常粗略的草图:

Queue currentQueue;
Element currentElement;

startElement(node){
  if( node is queue )
     currentQueue = new Queue();
  else if( node is element )
     currentElement = new Element(); 
}

characters( chars ) {
  currentElement.setName( chars );
}

endElement(node){
  if( node is queue )
     currentQueue = null;
  else if( node is element ) {
     currentQueue.add( currentElement ); <-- that's the important part
     currentElement = null; 
  }
}