2011-07-14 15 views
3

私はSAXの最初のXML文書の一部を単にorg.xml.sax.ContentHandlerを実装して解析しようとしていますが、その流れを理解しているかどうかはわかりません。与えられたXMLドキュメントの場合:SAXはどのようにドキュメントを解析しますか?

<?xml version="1.0"?> 
<list> 
    <item> 
     <name>One</name> 
     <description>The number 1, expressed in letters. 
    </item> 
    <item> 
     <name>Two</name> 
     <description>The number 2, expressed in letters. 
    </item> 
</list> 

パーサーの予想されるイベントの順序はどのようになりますか?私は次のことを前提にしていますか?

startDocument() 
    startElement() -> "list" 

     startElement() -> "item" 
      startElement() -> "name" 
       characters() (>=1 times) -> "One" 
      endElement() -> "name" 
      startElement() -> "description" 
       characters() (>=1 times) -> "The number 1, expressed in letters." 
      endElement() -> "description" 
     endElement() -> "item" 

     startElement() -> "item" 
      startElement() -> "name" 
       characters() (>=1 times) -> "Two" 
      endElement() -> "name" 
      startElement() -> "description" 
       characters() (>=1 times) -> "The number 2, expressed in letters." 
      endElement() -> "description" 
     endElement() -> "item" 

    endElement() -> "list" 
endDocument() 

それはかなり要点ですか?

また、どのような構文解析が最も簡単ですか?現在、startElementの各呼び出しで、characters呼び出しでデータを解析しているときのプライベート変数として現在の要素の名前を保存しています。それを行うより簡単な方法がありますか?

答えて

1

はい、あなたはその要点を持っています。

SAXは非常に低レベルのインターフェイスなので、簡単には期待しません。ほとんどのSAXアプリケーションでは、startElementが要素名をスタックにプッシュし、endElementがスタックをポップするスタックを維持したいと思うでしょう。混合コンテンツを処理していない場合、characters()はおそらくスタックの先頭にある要素に関連付けられたStringBufferに追加する必要があり、endElementイベントが発生したときにStringBufferの文字コンテンツを処理する必要があります。これは、文字コンテンツが、パーサが望む方法で文字()の複数の呼び出しに分割できるためです。

1

残念ながら、SAX状態マシンは十分に文書化されていません。いくつかの詳細を説明するのではなく、コンソールに起こったすべての情報を記録し、さまざまな入力で再生する最初のコンテンツハンドラとして書くことをお勧めします。

しかし、はい、あなたはそれの要点を持っています。

「解析するのが最も簡単な方法」という限りでは、私は「SAXではない」と言ってしまいます。 SAXを使用する際には、文書内の構造的な遷​​移を反映するステートマシンを実装する必要があります。ドキュメントがシンプルであれば、それ自体をステートマシンとして認識することさえできないかもしれません。しかし、そのように考えるなら、イベントが進むにつれて必要なものをどのように捨てるのかはかなり簡単にわかると思います。

+0

残念ながら、もっと良い解決策がわからない限り、私はRestletを使ってAndroid上にあるので、私はSAXを使用することを確信しています。 –

+0

[xstream](http://xstream.codehaus.org/faq.htm)を使用してみましたか? – bbaja42

関連する問題