2009-05-24 59 views
2

我必须用java SAX解析器解析一些xml。当我很忙的时候,我看到这里可以使用国家模式。SAX状态模式

定义了明确的状态和状态转换,类似于xml文档的结构。

要实现状态模式,我必须定义一个接口(或抽象类)。最明显的界面方法是:

public void startElement(String elementName); 
public void endElement(String elementName); 

但我遇到的问题是如何返回信息。我需要一个结构中xml文档中几个级别的信息。

这是XML文档

<chessboard> 
    <white> 
     <king> 
       <position> 
        <x>e</x> 
      <y>1</y> 
       </position> 
     </king> 
     <pawns> 
      <pawn id="1"> 
        <position> 
         <x>e</x> 
       <y>2</y> 
        </position> 
      </pawn> 
      <pawn id="1"> 
        <position> 
         <x>f</x> 
       <y>2</y> 
        </position> 
      </pawn> 
     </pawns> 
    </white> 
</chessboard> 

是我的假设正确的状态模式适合这里的一部分吗?如果是这样,在这里实现它的最好方法是什么?

+0

而不是状态模式,为什么你不使用允许随机访问的apis? – 2011-03-02 03:06:09

回答

2

您的接口可以通过实例“内部累积”特定所需信息的类来实现,并添加其他方法来使该信息可访问。

但是,很难有通用的“获取信息”方法,因为类型可能会有所不同;并且,这种整体方法可能不适合SAX类方法的主要优点,即随着解析的进行逐步执行操作的能力,而不是在解析过程中积累信息,并且仅在以后才行动(这种优势在你正在解析非常大的文件)。所以,我不会把它看作是在Java中使用SAX的“规范”方式,就像一种可能偶尔派上用场的变体一样。

+0

你让我思考。我可以将一个类传递给状态类的每个方法,并且状态类可以改变这个类。 即使使用SAX的正常方法,您也必须保持某种状态。 – Ikke 2009-05-25 06:56:59

0

我认为状态模式恰好适合这里。必须保留一些状态,才能知道你在文档中的位置。

要收集信息,您可以将一个对象传递给状态类的每个方法,以便他们可以将其信息放在那里。

除非有其他问题我没有想到,我认为这是最好的溶剂。