Java SAX ContentHandler для создания новых объектов для каждого корневого узла - PullRequest
0 голосов
/ 15 марта 2010

Я использую 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 Ответ

1 голос
/ 15 марта 2010

Вы не можете написать обработчик с циклом, как вы предложили. Он действительно основан на событиях, поэтому вам нужно самим отслеживать currentQueue и currentElement в своем обработчике. Также помните, что 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; 
  }
}
...