1

次のように、2つのxmlを含む単一のInputStreamまたはStringがあります。

<?xml version="1.0" standalone="yes"?> 
<items 
    blahblahblah1 
</items>           
<?xml version="1.0" standalone="yes"?> 
<items 
    blahblahblah2 
</items> 

形式は同じですが、データが異なります。それらを解析したいのですが、これは有効なxmlではないため、最初にそれらを分割する方法を見つける必要があります。

頭に浮かぶのは文字列操作だけです。

  1. 部分文字列によって、それらを2つの別々の文字列に分割します<?xml version="1.0 standalone="yes"?>
  2. 2つの行を検索して削除し<?xml version="1.0 standalone="yes"?>、残りを囲んで<ROOT> </ROOT>1つの有効なxmlを作成し、そこから解析する方法を見つけます

ただし、これらの方法はどちらもハッキーで非効率的です。もっと良い方法はありますか?

4

2 に答える 2

1

私がここで提案するものは何もテストされていませんが、これらは私が取ると思うルートです。

応答の長さが短いと予想される場合は、個人的には、連結されたXML応答Stringを提案どおりに配置し、標準的なString方法を使用して個々のXMLドキュメントを抽出する、提案したようにXMLを削除します。宣言文字列を作成し、ルート要素のペアでロット全体をラップします。XMLパーサーに単一のドキュメントをフィードするか、複数のドキュメントをフィードするかによって異なります。私は昔から扱っていませんが、を使用して応答エンティティのを取得し、そこからを取得するために可能な多くの方法の1つを使用BasicHttpResponseできると思います。InputStreammBasicHttpResponse.getEntity().getContent()StringInputStream

一方、かなり長いデータを処理することを期待している場合、または応答エンティティに連結されたXMLドキュメントの数が不確定である可能性がある場合は、代わりに、取得InputStreamしたデータをカスタムでラップするInputStreamReader、(a)ストリッピングを実行することを検討します。宣言と(b)新しいルート要素の挿入。SOには、対処する宣言がなかったことを除いて、ここで直面している問題と非常によく似た質問をした人がいます。user656449の回答を見るInputStreamと、SAXパーサーに渡す前にいくつかのダミールート要素でラップする方法の提案があります。

(参照されたSOの質問/回答から露骨にコピー):

SAXParserFactory saxFactory = SAXParserFactory.newInstance();
SAXParser parser = saxFactory.newSAXParser();

parser.parse(
    new SequenceInputStream(
        Collections.enumeration(Arrays.asList(
        new InputStream[] {
            new ByteArrayInputStream("<dummy>".getBytes()),
            new FileInputStream(file),//bogus xml
            new ByteArrayInputStream("</dummy>".getBytes()),
        }))
    ), 
    new DefaultHandler()
);

しかし、さらにこの状況では、宣言行のストリッピングを実行するために自分で作成したFileInputStreamものに置き換えます。から取得したものをラップアラウンドしてから、 CustomFilterFileInputStreamaddsを使用して新しいルートタグを追加します。CustomFilterFileInputStreamInputStreamBasicHttpResponseSequenceInputStream

このようにXMLデータを実際に受け入れる必要があり、1回の応答で大量のXMLデータを処理することを期待している場合は、このような方向に進む必要があると思います。

于 2012-09-18T21:47:35.617 に答える
1

"<?xml"文字列がCDATAセクションまたはコメント内に合法的に表示される可能性があるため、これは不適切な設計です。しかし、思い切ってファイルを分割し、表示されている場所でファイルを分割し"<?xml"、最善を期待し、このアイデアが間違っている場合は誰でも責任を負わなければなりません。唯一の代替手段は、このXMLのバリアント用に独自のパーサーを作成することですが、これはそれほど楽しいことではありません。

于 2012-09-18T21:15:22.330 に答える