【问题标题】:Java SAX ContentHandler to create new objects for every root nodeJava SAX ContentHandler 为每个根节点创建新对象
【发布时间】:2010-03-15 07:00:07
【问题描述】:

我正在使用 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 以允许上述算法的示例吗?

谢谢!

【问题讨论】:

    标签: java xml sax


    【解决方案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; 
      }
    }
    

    【讨论】:

    • 这对我来说很有意义。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多