2

コンパクトな XML に線形化 (空白とキャリッジ リターンを削除) しようとしています。

入力は

<?xml version="1.0" encoding="UTF-8"?> 
<books> 
    <book> 
       <title>Basic XML</title> 
       <price>100</price> 
       <qty>5</qty> 
    </book> 
    <book> 
        <title>Basic Java</title> 
        <price>200</price> 
        <qty>15</qty> 
    </book> 
</books>

出力は次のとおりです。

77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4gDQo8Ym9va3M+IA0KICAg PGJvb2s+IA0KICAgICAgIDx0aXRsZT5CYXNpYyBYTUw8L3RpdGxlPiANCiAgICAgICA8cHJpY2U+ MTAwPC9wcmljZT4gDQogICAgICAgPHF0eT41PC9xdHk+IA0KICAgPC9ib29rPiANCiAgIDxib29r PiANCiAgICAgPHRpdGxlPkJhc2ljIEphdmE8L3RpdGxlPiANCiAgICAgPHByaWNlPjIwMDwvcHJp Y2U+IA0KICAgICA8cXR5PjE1PC9xdHk+IA0KICAgPC9ib29rPiANCjwvYm9va3M+

変換するコードは次のとおりです。

public class XMLCompactTest {

public void testCompact() throws SAXException, IOException,
        ParserConfigurationException {

    final InputStream is =
            XMLCompactTest.class.getResourceAsStream("/example.xml");

    final byte[] bytes = IOUtils.toByteArray(is);
    final byte[] compactedBytes = compactXml(bytes);

    final String after = new String(compactedBytes);

    System.out.println(after);
}

 public static byte[] compactXml(final byte[] value)
        throws SAXException, IOException, ParserConfigurationException {

    final ByteArrayOutputStream bout = new ByteArrayOutputStream();
    final XStream xs = new XStream();
    xs.autodetectAnnotations(true);
    xs.setMode(XStream.ID_REFERENCES);
    //xs.marshal(value, new CompactWriter(new OutputStreamWriter(bout, "UTF-8")));
    xs.marshal(value, new CompactWriter(new OutputStreamWriter(bout)));

    return bout.toByteArray();
}

}

どんな助けでも大歓迎です。xmlの圧縮を扱う他の回答を参照しましたが、うまくいかないようです。xstream 1.4.3 を使用しています。

1 行の圧縮およびデコードされた xml を期待しています。

敬具。

4

1 に答える 1

0

ここで行っているのは、バイト配列をマーシャリングすることです。もちろん、これはいくつかの素晴らしい結果をもたらします。

compactXml()メソッドを手で書くだけです。

public static String compactXml(final byte[] value) {
   String in = new String(value, "UTF-8");
   StringBuffer sb = new StringBuffer();
   for(int i=0;i<in.length();i++) {
      char c = in.charAt(i);
      if(c != '\n' || c != ' ') {
         sb.append(c);
      }
   }
return sb.toString();
}
于 2012-08-06T12:44:22.397 に答える