2011-07-23 22 views
0

私の無料ウェブホストは、analytics javascriptをすべてのPHPおよびHTMLファイルに追加します。 AndroidアプリにXMLを送信したいが、ファイルを無効にすることを除いて、これは問題ありません。入力ストリームからジャンクトラッキングXMLを削除する

XMLはSAX ContentHandlerに渡される前に完全に解析されているため、例外をキャッチしてfleshedされたオブジェクトとともに気楽に続けることはできません。 (これは私が試した後、彼女について感じた)

合理的に効率的な戦略についての提案はありますか?

私は、入力ストリームを取るクラスを作成しようとしています。ジャンクを見つけて、それを読んでから、ちょっと書いたものを取り出し、InputStreamに変換して何も起こらないようにします。しかし、私はそれが大いに非効率であることを心配しています。対処してはならないバグ(例えば、埋め込まれたイメージなどのバイナリ値を破るなど)があり、うまくいけば不要です。

FWIW、これはAndroidプロジェクトの一部ですので、android.util.Xmlクラスを使用しています(source codeを参照)。私が例外をトレースしたときには、ネイティブ appendChars関数が呼び出されました。それ自体はプライベートメソッドのネットワークから呼び出されるため、何かをサブクラス化するのは不合理に役に立たないようです。

ここに私のスタックトレースから顕著なビットがあります:

E/AndroidRuntime( 678): Caused by: org.apache.harmony.xml.ExpatParser$ParseException: At line 3, column 0: junk after document element 
E/AndroidRuntime( 678): at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:523) 
E/AndroidRuntime( 678): at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:482) 
E/AndroidRuntime( 678): at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:320) 
E/AndroidRuntime( 678): at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:277) 

私はのInputStreamかどうかについての意見を求めている最終的に推測する - >手動OutputStreamにパース - > InputStreamを再作成 - >に沿って通過解決策は私が思うほど恐ろしいです。

+0

あなたのウェブホストに尋ねてください。(つまり、彼らはいつも一緒に送られてきます) –

+0

本物のウェブホストです。本格的なホスティングにサインアップしない限り、彼らは本当に顧客サービスをしません。 :) – inanutshellus

+0

と送信された写真/ CSSが一緒に送信されたjsの場合は? –

答えて

0

は、それを介して を読んで、休憩、その後、私はちょうど、入力ストリームに戻し、それを変換し、それを渡すために を書いたものを取ります何もないように、 が起こった。しかし、私はそれが大いに非効率で、バグを持っていることを心配しています (例えば、 埋め込まれたイメージのようなバイナリ値を破る)対処する必要はありません。あなたが行うには、バッファの必要性

最善のことは--theXML ends HERE --のようなXMLまたは16のグループのようなXMLで見つかっていない文字の末尾に区切り文字を追加していない、そのためにFilterStreamを使用することができます

XMLの終わりに\u04 chars(あなただけのすべての16番目のバイトをチェックする必要があります)、あなたはそれを\u04 delimを

class WebStream extends FilterInputStream { 

    byte[] buff = new byte[1024]; 
    int offset = 0, length = 0; 

    public WebStream(InputStream i) { 
     super(i); 
    } 

    @Override 
    public boolean markSupported() { 
     return false; 
    } 

    @Override 
    public int read() throws IOException { 
     if (offset == length) 
      readNextChunk(); 
     if (length == -1) 
      return -1;// eof 
     return buff[offset++]; 
    } 

    @Override 
    public int read(byte[] b, int off, int len) throws IOException { 
     if (offset == length) 
      readNextChunk(); 
     if (length == -1) 
      return -1;// eof 

     int cop = length - offset; 
     if (len < cop) 
      cop = len; 
     System.arraycopy(buff, offset, b, off, cop); 
     offset += cop; 
     return cop; 
    } 

    private void readNextChunk() throws IOException { 
     if (offset <= length) { 
      System.arraycopy(buff, offset, buff, 0, length - offset); 
      length -= offset; 
      offset = 0; 
     } 
     int read = in.read(buff, length, buff.length - length); 
     if (read < 0 && length <= 0) { 
      length = -1; 
      offset = 0; 
      return; 
     } 

     // note that this is assuming ascii compatible 
     // anything like utf16 or utf32 will break here 
     for (int i = length; i < read + length; i += 16) { 
      if (buff[i] == 0x04) { 
       while (buff[--i] == 0x04) 
        ;// find beginning of delim block 
       length = i; 
       read = 0; 
      } 
     } 
    } 

} 
を想定し

実装を見つけるまで読みます

このミスはスローされ、いくつかのエラーチェックと適切なデバッグが必要です。

0

"私は、入力ストリームを取るクラスを作成しようとしていますが、ジャンクを見つけて、それを読んでから、ちょうど書いたものを取り出し、それをInputStreamに変換して、しかし、私はそれが大いに非効率的であり、対処しなくてはならないバグ(例えば、埋め込まれたイメージのようなバイナリ値を壊す)と望ましくないことを心配しています。

これはうまくいくでしょう。 StringBufferを読み込み、ByteArrayInputStreamなどを使用できます(該当する場合はStreamReaderなど)。

http://developer.android.com/reference/java/io/ByteArrayInputStream.html

欠点は、あなたが全体をメモリにXMLファイルで読んでいる、大きなファイルのために、それは非効率的なメモリごとにできることです。

また、InputStreamをサブクラス化し、ストリームを介してフィルタリングを行うこともできます。おそらく、super.read()を呼び出し、最後にガベージに入ったときにフラグを立て、必要に応じてEOFを返すことによって、3つのread()メソッドをオーバーライドする必要があります。私はジャンクを見つけるまで、私は私のInputStreamを取るクラスを作成しようとしてい

0

フリーウェブホストこの問題があります。私はまだフリーモードでまだ代替案を見つけていません。

関連する問題