0

XML (String オブジェクト内) が適切に形成されているかどうかを検証したいと考えています。このような:

"<root> Hello StackOverflow! <a> Something here </a> Goodbye StackOverflow </root>"

属性も検証する必要がありますが、私は今のところそれにはほど遠いです。ロジックが正しいことを確認したいだけです。これが私がこれまでに得たものですが、行き詰まっており、助けが必要です。

public boolean isWellFormed( String str )
{
    boolean retorno = true;

    if ( str == null )
    {
        throw new NullPointerException();
    }

    else
    {
        this.chopTheElements( str );
        this.chopTags();

    }
    return retorno;
}

private void chopTags()
{
    for ( String element : this.elements )
    {
        this.tags.add( element.substring( 1, element.length()-1 ) );
    }
}

public void chopTheElements( String str )
{
    for ( int i = 0; i < str.length(); i++ )
    {
        if ( str.charAt( i ) == '<' )
        {
            elements.add( getNextToken( str.substring( i ) ) );
        }
    }
}

private String getNextToken( String str )
{
    String retStr = "";

    if ( str.indexOf( ">" ) != -1 )
    {
        retStr = str.substring( 0, str.indexOf( ">" ) + 1 );
    }

    return retStr;
}

これまでのところ、"" のような要素をリストに切り刻んでから、次のように別のリストにタグを切り刻みました: root、/root.

しかし、どのように進むべきか、または正しい方向に進んでいるかどうかはわかりません。私は正規表現なしでこれを解決するために割り当てられました。

何かアドバイス?私はここで迷っています。ありがとう。

4

2 に答える 2

1

「<」が表示されたときに文字列を分割することから始めるのは適切ではありません。これは、識別したチャンクが XML の階層構造とは無関係になるためです。たとえば、入力として次の場合:

<a>xxx<b>...</b>yyy</a>

チャンクの 1 つが "/b>yyy<" になり、これをさらに分割するのは役に立ちません。

文法の構造に従ってコードを構造化する必要があります。要素が開始タグ、(要素または文字) のシーケンス、および終了タグで構成されると文法が示している場合、そのシーケンスに一致し、他のメソッドを呼び出してそのコンポーネントを処理するメソッドが必要です。文法が再帰的であるため、コードも再帰的になります。これは、再帰的下降解析として知られています。これはコンピュータ サイエンスのコースでよく教えられていることなので、教科書にはこのトピックに関する優れた内容が記載されています。

于 2012-10-04T21:10:06.763 に答える
0

巨大な XML ファイルを扱っていない場合は、その目的のために DOM パーサーを検討してください。この目的のためにDocumentBuilderクラスを調べることをお勧めします。parse()実際には、さまざまなメソッドを呼び出す必要があります (ソースは、ファイルまたはその他の InputSource にすることができます) 。

于 2012-10-04T19:04:20.847 に答える