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インスタンスを作成します.
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