5

次のようなxmlファイルがあります。

<file>
     <students>
          <student>
               <name>Arthur</name>
               <height>168</height>
          </student>
          <student>
               <name>John</name>
               <height>176</height>
          </student>
     </students>
</file>

各開始タグに終了タグがあるかどうかを確認するにはどうすればよいですか? たとえば、終了タグを次のように指定しない場合:

<file>
     <students>
          <student>
               <name>Arthur</name>
               <height>168</height>
          // Ending tag for student missing here
          <student>
               <name>John</name>
               <height>176</height>
          </student>
     </students>
</file>

ファイルの残りの解析を続行するにはどうすればよいですか?

hereで説明されているように SAX パーサーを試してみましたが、提供した 2 番目の xml コードのように終了タグを提供しないと例外がスローされるため、私にはあまり適していません。

4

3 に答える 3

0

次のアルゴリズム (疑似コード) を実装できます。

String xml = ...
stack = new Stack()

while True:

    tag = extractNextTag(xml)

    // no new tag is found
    if tag == null:
       break

    if (tag.isOpening()):
        stack.push(tag.name)
    else:
        oldTagName = stack.pop()
        if (oldTagName != tag.name):
            error("Open/close tag error")
if ! stack.isEmpty():
    error("Open/close tag error")

パーサーに関する知識を使用するか、単純な正規表現を記述するだけで、10 ~ 20 行のコードで関数 extractNewTag を実装できます。もちろん、新しいタグを検索するときは、最後に見つけたタグに続く記号から検索を開始する必要があります。

于 2012-10-31T15:43:39.440 に答える
0

「開始タグごとに終了タグがある」という条件を検証しない XML ファイルは、整形式ではありませ。XML ファイルが整形式であることを確認することは、XML パーサーの最初の仕事です (最初のタスクです)。したがって、XML パーサーが必要です。

于 2012-10-31T15:41:08.830 に答える
0

あなたが見つけたチュートリアルにはバグがあります。同じ要素 ( sourcecharacters() )に対して複数回呼び出される場合があります。要素の終わりをマークする適切な方法は、 内のそれぞれのブール状態をリセットすることです。コメント セクションには、必要な変更を示すコードがあります。endElement()

その問題が修正されたら、エラー チェックを実行しstartElement()て、現在の状態でファイルが無効な要素を開始しようとしていないことを確認できます。nameこれにより、要素が要素の内部でのみ見つかるようにすることもできますstudent

于 2012-10-31T15:41:28.583 に答える