Android実戦テクニックその53:dom 4 j&xstream
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に保存する
一般的なシーンは、このような層の簡単なxmlを解析するために、以前の私のやり方のように、解析コードを書くのではなく、最も簡単なバージョンで直接解析します.この場合はDom 4 Jで対応し,解析例は以下の通りである.
2、上記xmlをJavaクラスに変換するこれは必ずXStreamを使います.例は以下の通りです.
個人的には、この2つのライブラリは本当に使いやすいと思います.複雑なxmlに対応するには少し不足するかもしれませんが、現在の私のアプリケーションシーンでは、簡単な使用がすべてを圧倒しています.
残りのコード
私は2つのクラスを建てました.上のXStreamProcessor機能はそんなに単一で、xmlファイル生成のタスクはDom 4 jProcessorに置かれています.
後記
プログラムの性能と符号化の複雑さでは、実行性能がすべてを圧倒するわけではありません.
参考: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
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