Android実戦テクニックその53:dom 4 j&xstream

9662 ワード

Dom 4 JとXStreamはJavaプラットフォームで広く使用されているXMLオープンソースパッケージです.Dom 4 Jの特徴は簡単で使いやすいことですが、私がXStreamを選んだ理由はXML変換Javaクラスです.
Androidプラットフォーム上でXMLを解析する手段は3種類あり,DOM,SAX,PULLである.いずれにしても、XMLを解析するには大編のコードを書かなければならない.少し変更すれば、殺人の大心さえある.
モバイルプラットフォームでは、メモリとネットワーク帯域幅がボトルネックです.一部のプログラムは性能の極致を追求するために手段ではなく、一部のプログラムの煩雑な符号化はプログラマーの前で大きな障害であり、私たちが経験したプロジェクトでは、簡単で使いやすいツールを使って煩雑なXMLとJson解析を簡略化することが急務である.したがって、上記の2つのツールをAndroidプラットフォームに使用するのは良い選択です.もう一つの利点は、大きなサーバ側もJava開発であり、前後の両端に同じツールを使用することは、プロジェクトにとって非常に有益です.
バージョン要件
Dom 4 JとXStreamはオープンソースプロジェクトで、githubでソースコードを見つけることができます.では、私たちの要求に応じて、対応するバージョンのコンパイルをダウンロードすることができます.XStreamは特殊で、高バージョンはJava 8のコンパイルで、現在Android Studioはまだサポートされていません.私のところは直接バージョンを下げて使用しています.xstream-1.4.7はスムーズに動作します.
最も単純なニーズ
1、下記xmlの内容を一つのmapに保存する
<access>
<access_token>243656dfjjfxcbb</access_token>
<expires_in>360</expires_in>
</access>

一般的なシーンは、このような層の簡単なxmlを解析するために、以前の私のやり方のように、解析コードを書くのではなく、最も簡単なバージョンで直接解析します.この場合はDom 4 Jで対応し,解析例は以下の通りである.
    public Map<String, String> parseXml(String file) throws Exception {
        Map<String, String> map = new HashMap<String, String>();

        SAXReader reader = new SAXReader();
        InputStream input = new FileInputStream(file);
        Document document = reader.read(input);
        Element root = document.getRootElement();

        List<Element> elementList = root.elements();

        for (Element e : elementList){
            Log.d(TAG, "name: " + e.getName() + " text: " + e.getText());
            map.put(e.getName(), e.getText());
        }

        return map;
    }

2、上記xmlをJavaクラスに変換するこれは必ずXStreamを使います.例は以下の通りです.
    private XStream mXStream = null;

    public XStreamProcessor() {
        mXStream = new XStream(new DomDriver());
    }


    public void parseXml(String file) throws Exception {
        InputStream input = new FileInputStream(file);
        mXStream.alias("access", Access.class);
        Access access = (Access)mXStream.fromXML(input);
        Log.d(TAG, access.toString());
    }

個人的には、この2つのライブラリは本当に使いやすいと思います.複雑なxmlに対応するには少し不足するかもしれませんが、現在の私のアプリケーションシーンでは、簡単な使用がすべてを圧倒しています.
残りのコード
私は2つのクラスを建てました.上のXStreamProcessor機能はそんなに単一で、xmlファイル生成のタスクはDom 4 jProcessorに置かれています.
public String buildXML(){
        Log.d(TAG,"buildXML");
        StringWriter xmlWriter = new StringWriter();
        Access access = new Access("243656dfjjfxcbb", "360");

        try {
            Document doc = DocumentHelper.createDocument();
            doc.setXMLEncoding("utf-8");

            Element element = doc.addElement("access");
            element.addAttribute("author", "linc");
            element.addAttribute("date", "2016-06-11");
            element.addComment("dom4j tester");

            Element elementToken = element.addElement("access_token");
            elementToken.addText(access.getAccess_token());

            Element elementExpire = element.addElement("expires_in");
            elementExpire.addText(access.getExpires_in());

            OutputFormat outputFormat = new OutputFormat();
            outputFormat.setEncoding("utf-8");
            outputFormat.setIndent(false);
            outputFormat.setNewlines(true);
            outputFormat.setTrimText(true);

            XMLWriter output = new XMLWriter(xmlWriter, outputFormat);
            output.write(doc);
            output.close();
        } catch (Exception e) {
            Log.e(TAG,"build failed: "+e.getMessage());
        }
        Log.d(TAG,xmlWriter.toString());
        try {
            saveToSDCard("access",xmlWriter.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return xmlWriter.toString();
    }

    private void saveToSDCard(String filename, String filecontent)throws Exception{
        File file = new File(Environment.getExternalStorageDirectory(),filename);
        FileOutputStream outStream = new FileOutputStream(file);
        outStream.write(filecontent.getBytes());
        outStream.close();
    }

後記
プログラムの性能と符号化の複雑さでは、実行性能がすべてを圧倒するわけではありません.
参考:1、『XStream読み取りファイル内容をJAVAオブジェクトに変換』:http://www.ibm.com/developerworks/cn/xml/x-xstream/ 2、http://blog.csdn.net/sunboy_2050/article/details/75216053、『androidにおけるXMLとオブジェクト変換器Xstreamの使用』:http://blog.csdn.net/shimiso/article/details/7743639