2010-03-15 82 views
0

我正在使用SAX来解析某些XML。比方说,我有以下XML文档:Java SAX ContentHandler为每个根节点创建新对象

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

而且我也有一个要素类:

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

您不能按照您的建议使用循环编写处理程序。这是真的基于事件的,所以你需要跟踪你的处理程序中的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; 
    } 
} 
+0

这对我来说很有意义。非常感谢您的帮助! – littleK 2010-03-15 07:34:10

相关问题