2012-04-14 22 views
0

私は次のテキストが含まれるXMLタグとSAXパーサー持っている:「&アンプを、B」(そこにはスペースがありません - それはここ&に変換しないように添加した)アンドロイド - のXMLアンパサンド変換

それは、2回変換され、 "A"の結果を持つアンパサンドのためにエスケープされているかのようです。ここではプロセスです:

XMLファイルは、データは、デバッグでのendElement

else if (inLocalName.equalsIgnoreCase(_nodeTitle)) 
     { 
      _titleValue = currentValue; 
      currentValue = ""; 
     } 

にサックスで変換され

InputStream _inputStream = _urlConnection.getInputStream(); 
         BufferedInputStream _bufferedInputStream = new BufferedInputStream(_inputStream); 
         ByteArrayBuffer _byteArrayBuffer = new ByteArrayBuffer(64); 

         int current = 0; 
         while((current = _bufferedInputStream.read()) != -1) 
         { 
          _byteArrayBuffer.append((byte)current); 
         } 

         FileOutputStream _fileOutputStream = openFileOutput(_file, MODE_PRIVATE); 

         _fileOutputStream.write(_byteArrayBuffer.toByteArray()); 
         _fileOutputStream.close(); 

私はそれを読んだとき、アンパサンドが既に変換されたデータが切り捨てダウンロードされますハンドラ内の私の文字メソッドで。

これについて多くの質問がありましたが、解決策はありませんでした。何か案は?

おかげ

パーサ:

List<PropertiesList> _theList = null; 

     try 
     { 
      // Create Factory, Parser, Reader, Handler 
      SAXParserFactory _saxParserFactory = SAXParserFactory.newInstance(); 
      SAXParser _saxParser = _saxParserFactory.newSAXParser(); 
      XMLReader _xmlReader = _saxParser.getXMLReader(); 
      HandlerReps _handler = new HandlerReps(inRegion, inAbbreviation); 

      _xmlReader.setContentHandler(_handler); 
      _xmlReader.parse(new InputSource(inStream)); 

      _theList = _handler.getTheList(); 
     } 

ハンドラ:これは非常に可能性があなたの問題の原因である

// Called when Tag Begins 
    @Override 
    public void startElement(String uri, String inLocalName, String inQName, Attributes inAttributes) throws SAXException 
    { 
     currentElement = false; 
    } 

    // Called when Tag Ends 
    @Override 
    public void endElement(String inUri, String inLocalName, String inQName) throws SAXException 
    { 
     currentElement = false; 

     // Title 
     if (inLocalName.equalsIgnoreCase(_nodeValue)) 
     { 
      if (_stateValue.equalsIgnoreCase(_abbreviation) && 
       _countryValue.equalsIgnoreCase(_region)) 
      { 
       // Construct the object 
       PropertiesRegion _regionObject = new PropertiesRegion(_titleValue, _address1Value); 

       cList.add(_regionObject); 

       Log.d(TAG, _regionObject.toString()); 
      } 

      _titleValue = ""; 
      _address1Value = ""; 
     } 

     // Title 
     else if (inLocalName.equalsIgnoreCase(_nodeTitle)) 
     { 
      _titleValue = currentValue; 
      currentValue = ""; 
     } 

     // Address1 
     else if (inLocalName.equalsIgnoreCase(_nodeAddress1)) 
     { 
      _address1Value = currentValue; 
      currentValue = ""; 
     } 
    } 

    // Called to get Tag Characters 
    @Override 
    public void characters(char[] inChar, int inStart, int inLength) throws SAXException 
    { 
     if (currentElement) 
     { 
      currentValue = new String(inChar, inStart, inLength); 
      currentElement = false; 
     } 
    } 
+0

実際にXMLを解析するコードをもっと表示してください。 URLからファイルへのダウンロードは面倒です。 :-) openFileOutput()で何か間違っていない限り。それに、ここでダウンロードはかなり非効率な方法で行われましたが、これは別の質問です。一言で言えば、InputStream/OutputStreamのシングルバイトメソッドを使用しないでください。 –

+0

私が気づいていないことがある場合に備えて、ダウンロードコードを追加しました。その時点で&が変換されています。私はDOMパーサで全く同じプロセスを実行しましたが、パフォーマンスは受け入れられませんでした。しかし、出力は正しいです。 – user1222760

+0

まだ十分な文脈はありませんが、とにかく試してみました。下の私の答えを見てください。 –

答えて

1

:各テキストコンテンツノードの場合

if (currentElement) 
    { 
     currentValue = new String(inChar, inStart, inLength); 
     currentElement = false; 
    } 

、 SAXパーサはセンd複数の文字()イベントをハンドラに渡します。これらのすべてのイベントを連結すると、テキスト全体が表示されます。しかし、あなたのコードでは、これらのイベントの最初のものだけが使用されます。なぜなら、currentElement = falseを設定するからです。

問題はアンパサンド変換ではありません。一般的なルールとして、問題を説明するときは、症状を説明するだけでよく、原因は考えられません。

+0

OK - 私はそれを得た。それは変換ではありません。私は '&'と裸のアンパサンドは、Saxが出力をどのように処理するかに影響すると考えました。それはしません。 – user1222760

+0

テキストが(おそらく) '&'のために複数のイベントに分割されています。 SAXは非常に性能に敏感なAPIです。そのため、テキストを複数のイベントとして送信しています。パーサは文字配列を読み込み、 '&'が見つかると、 '&'まですべてをハンドラに送り、エスケープされていない '&'文字を1つ送信し、残りの配列は '&'の後に送信します。このようにすると、パーサーは '&'をエスケープするために新しい文字配列を作成することを避けることができます。 (これはSAXパーサーが動作する可能性がある方法の1つですが、他の可能性もあります) –

+0

私は今あなたに従います。私は、 '&'と裸のアンパサンドが、Saxが文字配列をどのように処理/構築するかに影響することに気付きました。明らかにそれは真実ではありません。いずれにしても、あなたが提案した変更を行い、今は完全に機能します。私は助けに感謝します! – user1222760