0

例:

...some string content here...
<test>
    <a>
        ...something...
    </a>
    <a/>
    {position 1}
    <b>{position 2}
        <c>
            ...something else...
            {position 3}
        </c>
        <c/>
        <d>
            <e/>
            {position 4}
            <e>
                ...another thing here...
                {position 5}
            </e>
        </d>
        {position 6}
    </b>
    {position 7}
...more xml and other sting content...

上で指定した位置 (たとえば) で、親を囲む要素を見つける必要があります。

結果は次のようになります: {position 1} = test {position 2} = b {position 3} = c {position 4} = d {position 5} = e {position 6} = b {position 7} = test

備考: - 既知の要素タグ名はありません - ホール文字列には xml 以外のコンテンツが含まれている可能性があります - データのサイズが非常に大きい (テキスト ファイルが 50MB を超える)

有効な一致 (存在する場合) が見つかるまで、指定された位置から逆方向に読み取るように実装された検索手法が必要です。

ありがとう

4

1 に答える 1

1

定義上、無効な XML は解析できません。そのため、XML パーサーは単純に解析を拒否し、エラーを返します。

XML パーサーがそれを解析できない場合は、(基本的に) あなたも解析できません。あなたが求めているのは、正規表現で取得できる単純な文字列やタグの単純なコレクションではありません。特定の場所にある親タグを見つけるには、(おそらく無効なデータの)完全な解析を実行する必要があります。

更新:私が話していることを確認するには{position 1}、あなたの例での親を見つけることを考えてください。

  • この問題に対する単純な開始方法は、「さかのぼって開始タグを見つける」ことです。しかし、見つけた最初の開始タグ ( <a>) は、ポジションの前に閉じているため、明らかに使用できません。
  • そのため、遡っ</a>てタグが閉じられたことを確認して覚えておく必要があります。これにより、親として<a>カウントされなくなります。<a>
  • そしてもちろん、親に到達する前に、任意の量の開始タグと終了タグが存在する可能性があります。それらすべてを追跡する必要があります (同じタグの複数の出現を含む)。

ご覧のとおり、これは非常に複雑です。そして、それはファイル内の無効な要素を許可する前です。

ファイルのエラーが正確にわかっている場合は、それらのエラーを削除してから、修正したファイルを XML パーサーにフィードすることができます。

そうしないと、特定のブランドの無効な XML 用に独自のカスタム パーサーを作成する必要があります。また、ファイル内のエラーの種類によっては、それが不可能な場合もあります。

于 2013-02-21T15:18:13.033 に答える