AndroidのDOM解析XML
7002 ワード
一.DOM解析方法の紹介
DOMは、開発者がDOM APIを使用してXMLツリーを巡回し、必要なデータを取得できるようにするツリー構造に基づくノードまたは情報フラグメントの集合である.この構造を解析するには、通常、ドキュメント全体をロードし、ツリー構造を構築してから、ノード情報を取得および更新する必要があります.
AndroidはDOM解析を完全にサポートしています.DOMのオブジェクトを使用すると、XMLドキュメントの読み取り、検索、修正、追加、削除などの操作ができます.
DOMの動作原理:DOMを使用してXMLファイルを操作する場合、まずファイルを解析して、ファイルを独立した要素、木の形、注釈などに分けて、それからノードツリーの形式でメモリの中でXMLファイルを表示して、ノードツリーを通じてドキュメントの内容にアクセスすることができて、そして必要に応じてドキュメントを修正します—これがDOMの動作原理です.
DOM実装では、まずXMLドキュメントの解析にインタフェースのセットを定義し、解析器はドキュメント全体を読み込み、メモリを保持するツリー構造を構築します.これにより、コードはDOMインタフェースを使用してツリー構造全体を操作することができます.
DOMはメモリにツリー構造で格納されるため、取得と更新の効率が向上します.しかし、特に大きなドキュメントでは、ドキュメント全体を解析してロードするとリソースが消費されます.もちろん、XMLドキュメントの内容が小さい場合は、DOMを採用することは可能です.
XMLの基本的なノードタイプ:
Node-DOM基本データ型
Element---最も主要な処理の対象はElementです
Attr---要素のプロパティ
Text---ElementまたはAttrの実際の内容
Document---XMLドキュメント全体を表すドキュメントで、Documentオブジェクトは通常ツリーとも呼ばれます.
利点:ドキュメント全体をメモリに読み込み、操作が容易で、修正、削除、再配置など多くの機能をサポートします.
欠点:ドキュメント全体をメモリに読み込み、不要なノードを過剰に保持し、メモリとスペースを浪費します.
使用場面:ドキュメントを読み込むと、複数回ドキュメントを操作する必要があり、ハードウェアリソースが十分な場合(メモリ、CPU).
二、DOM解析手順
1. まずDocumentBuilderFactoryを使用してDocumentBuilderFactoryインスタンスを作成します.
2. DocumentBuilderFactoryを使用してDocumentBuilderを作成します.
3. XMLドキュメントをロードします.
4. ドキュメントのルートノードの取得(Element)
5. ルートノード内のすべてのサブノードのリストを取得する(NodeList)
6. 次に、サブノードリストの読み取りが必要なノードを取得します.
DOMは、開発者がDOM APIを使用してXMLツリーを巡回し、必要なデータを取得できるようにするツリー構造に基づくノードまたは情報フラグメントの集合である.この構造を解析するには、通常、ドキュメント全体をロードし、ツリー構造を構築してから、ノード情報を取得および更新する必要があります.
AndroidはDOM解析を完全にサポートしています.DOMのオブジェクトを使用すると、XMLドキュメントの読み取り、検索、修正、追加、削除などの操作ができます.
DOMの動作原理:DOMを使用してXMLファイルを操作する場合、まずファイルを解析して、ファイルを独立した要素、木の形、注釈などに分けて、それからノードツリーの形式でメモリの中でXMLファイルを表示して、ノードツリーを通じてドキュメントの内容にアクセスすることができて、そして必要に応じてドキュメントを修正します—これがDOMの動作原理です.
DOM実装では、まずXMLドキュメントの解析にインタフェースのセットを定義し、解析器はドキュメント全体を読み込み、メモリを保持するツリー構造を構築します.これにより、コードはDOMインタフェースを使用してツリー構造全体を操作することができます.
DOMはメモリにツリー構造で格納されるため、取得と更新の効率が向上します.しかし、特に大きなドキュメントでは、ドキュメント全体を解析してロードするとリソースが消費されます.もちろん、XMLドキュメントの内容が小さい場合は、DOMを採用することは可能です.
XMLの基本的なノードタイプ:
Node-DOM基本データ型
Element---最も主要な処理の対象はElementです
Attr---要素のプロパティ
Text---ElementまたはAttrの実際の内容
Document---XMLドキュメント全体を表すドキュメントで、Documentオブジェクトは通常ツリーとも呼ばれます.
利点:ドキュメント全体をメモリに読み込み、操作が容易で、修正、削除、再配置など多くの機能をサポートします.
欠点:ドキュメント全体をメモリに読み込み、不要なノードを過剰に保持し、メモリとスペースを浪費します.
使用場面:ドキュメントを読み込むと、複数回ドキュメントを操作する必要があり、ハードウェアリソースが十分な場合(メモリ、CPU).
二、DOM解析手順
1. まずDocumentBuilderFactoryを使用してDocumentBuilderFactoryインスタンスを作成します.
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
2. DocumentBuilderFactoryを使用してDocumentBuilderを作成します.
DocumentBuilder builder = factory.newDocumentBuilder();
3. XMLドキュメントをロードします.
Document dom = builder.parse(inputStream);
4. ドキュメントのルートノードの取得(Element)
Element root = dom.getDocumentElement();
5. ルートノード内のすべてのサブノードのリストを取得する(NodeList)
NodeList items = root.getElementsByTagName("person");
6. 次に、サブノードリストの読み取りが必要なノードを取得します.
( i = 0; i
、DOM XML
1. XML itcase.xml, res/raw 。
liming
30
lixiangmei
25
rawフォルダがない はresフォルダの にrawフォルダを しxmlファイルを します.
2.ビューの
3. AnalyzeDOM
package com.zhangmiao.analyzexmldemo;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;/**
* Created by zhangmiao on 2016/12/14. */public class AnalyzeDOM { public static List readXML(InputStream inputStream) {
List persons = new ArrayList<>();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try {
DocumentBuilder builder = factory.newDocumentBuilder();
Document dom = builder.parse(inputStream);
Element root = dom.getDocumentElement();
NodeList items = root.getElementsByTagName("person"); for (int i = 0; i
4. MainActivity
package com.zhangmiao.analyzexmldemo;import android.os.Bundle;import android.support.design.widget.FloatingActionButton;import android.support.design.widget.Snackbar;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import android.util.Log;import android.view.View;import android.view.Menu;import android.view.MenuItem;import android.widget.Button;import android.widget.TextView;import org.xml.sax.InputSource;import java.io.BufferedWriter;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStreamWriter;import java.io.StringWriter;import java.util.List;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;public class MainActivity extends AppCompatActivity implements View.OnClickListener { private static final String TAG = "AnalyzeXMLDemo"; private TextView mTextView; private InputStream inputStream;
@Override protected void onCreate(Bundle savedInstanceState) {
Log.v(TAG, "onCreate"); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
Button domButton = (Button) findViewById(R.id.dom_button);
mTextView = (TextView) findViewById(R.id.text);
domButton.setOnClickListener(this);
}
@Override public void onClick(View v) {
String result = "";
inputStream = getResources().openRawResource(R.raw.itcase); switch (v.getId()) {case R.id.dom_button:
result += "--------- DOM ---------" + "
"; if (inputStream == null) {
result = "inputStream is null";
} else {
List personList = AnalyzeDOM.readXML(inputStream); if (personList != null) { for (int i = 0; i