3

これまで、Android アプリでDOMSourceを使用して XML ファイルを文字列に変換していました。

これが私のコードです:

public  String convertElementToString (Node element) throws TransformerConfigurationException, TransformerFactoryConfigurationError
{
      Transformer transformer = TransformerFactory.newInstance().newTransformer();
      transformer.setOutputProperty(OutputKeys.INDENT, "yes");

       //initialize StreamResult with File object to save to file
      StreamResult result = new StreamResult(new StringWriter());
      DOMSource source = new DOMSource(element);

      try {
          transformer.transform(source, result);  
      } 
      catch (TransformerException e) {
          Log.e("CONVERT_ELEMENT_TO_STRING", "converting element to string failed. Aborting", e);
      }

      String xmlString = result.getWriter().toString();
      xmlString = xmlString.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "");
      xmlString = xmlString.replace("\n", "");
      return xmlString; 
}

これは、小さな xmlファイルでは問題なく機能していました。

しかしサイズの大きい xml の場合、このコードはOutOfMemoryError をスローし始めました。

その背後にある理由と、この問題を修正する方法は何ですか?

4

1 に答える 1

1

まず、XML を文字列としてのみ必要とし、Node他に を使用しない場合は、代わりに StAX ( Streaming API for XML ) を使用する必要があります。これは、メモリ使用量がはるかに少ないためです。StAX はjavax.xml.stream、標準ライブラリのパッケージに含まれています。

現在のコードに対する改善の 1 つは、次の行を変更することです。

transformer.setOutputProperty(OutputKeys.INDENT, "yes");

transformer.setOutputProperty(OutputKeys.INDENT, "no");

とにかくメソッドの最後で改行を削除しているため、出力で追加のインデントを要求することはあまり役に立ちません。これは小さなことですが、XML に多数のタグ (したがって、改行とインデント用の空白) がある場合、メモリ要件が少し減る可能性があります。

于 2013-04-10T05:06:21.490 に答える