4.1 解析 XML 数据的三种方式详解

利用Dom,Sax,Pull三种方式解析xml文件 最近找工作,看到许多公司的要求里都写了要会xml解析,所以就把之前的xml解析知识又重新回顾了一下,写个小例子. 解析xml文件常用的几种方式也就dom,sax,pull了,并且面试官经常问到的也是这三种解析方式之间的优缺点以及使用情况,先说一下这三种方式的优缺点和使用情况吧: 其实dom,sax,pull之间的优缺点网上有很多,讲的搞不好比我的还要深入和贴切,不过还是要说一下,毕竟自己以后还 阅读详情

点此进入:从零快速构建APP系列目录导图
点此进入:UI编程系列目录导图
点此进入:四大组件系列目录导图
点此进入:数据网络和线程系列目录导图

通常情况下,每个需要访问网络的应用程序都会有一个自己的服务器,我们可以向服务器提交数据,也可以从服务器上获取数据。不过这个时候就出现了一个问题,这些数据到底要以什么样的格式在网络上传输呢?随便传递一段文本肯定是不行的,因为另一方根本就不会知道这段文本的用途是什么。因此,一般我们都会在网络上传输一些格式化后的数据,这种数据会有一定的结构规格和语义,当另一方收到数据消息之后就可以按照相同的结构规格进行解析,从而取出他想要的那部分内容。

在网络上传输数据时最常用的格式有两种, XML 和 JSON,下面我们就来一个个地进行学习,本篇首先学一下如何解析 XML 格式的数据。

本节例程下载地址:WillFLowXML

一、XML数据要点介绍

1、首先介绍一下xml语言

可扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。

2、xml的语法

XML 分为两部分:头信息,主体信息
  • 头信息是用来描述 XML 的一些属性,例如:版本,编码等,还可以提供 XML 显示的样式,和 dtd 编写格式。
  • 主体信息中包含的是 XML 的具体数据。
头信息的语法:
<?xml version =”1.0” encoding =”GBK” ?>

其中 version 是必须加的,而 encoding 可以不写,则默认编码是 ISO8859-1 ,不支持中文。除了这个功能外,头信息还可以进行编写格式的规定,通过 dtd 或 xsd 文件。头信息还支持样式表的导入,允许通过样式表控制 XML 的显示。

这样可以使用 XML+ CSS 完成页面的显示,通过这种形式完成 MVC 中的 View 层:
- 优点:代码的安全性很高,可以很容易的替换模板。
- 缺点:开发成本太高。

二、XML常用三种解析方式的优缺点

(1)DOM(Document Object Model)

文档对象模型分析方式。以层次结构(类似于树型)来组织节点和信息片段,映射XML文档的结构,允许获取和操作文档的任意部分,是W3C的官方标准。

优点:
1、允许应用程序对数据和结构做出更改。
2、访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据。

缺点:
通常需要加载整个XML文档来构造层次结构,消耗资源大

(2)SAX(Simple API for XML)

流模型中的推模型分析方式。通过事件驱动,每发现一个节点就引发一个事件,通过回调方法完成解析工作,解析XML文档的逻辑需要应用程序完成。

优点:
1、不需要等待所有数据都被处理,分析就能立即开始。
2、只在读取数据时检查数据,不需要保存在内存中。
3、可以在某个条件得到满足时停止解析,不必解析整个文档。
4、效率和性能较高,能解析大于系统内存的文档。

缺点:
1、需要应用程序自己负责TAG的处理逻辑(例如维护父/子关系等),使用麻烦。
2、单向导航,很难同时访问同一文档的不同部分数据,不支持XPath。

(3)XMLPull解析

一种基于事件流的解析方案、类似于SAX解析、Android中推荐的一种解析方案、Android 中内置了XMLPull解析的API。

Pull解析和Sax解析不一样的地方有:
1、pull读取xml文件后触发相应的事件调用方法返回的是数字
2、pull可以在程序中控制想解析到哪里就可以停止解析。

三、用三种方式解析XML

1、准备工作

首先,我们在主界面定义好四个按钮以及用于内容展示的ListView,代码如下:
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.wgh.willflowxml.MainActivity">

    <Button
        android:id="@+id/button_dom"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="DOM解析"
        android:textColor="#0787ff"
        android:textSize="22dp" />

    <Button
        android:id="@+id/button_sax"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="SAX解析"
        android:textColor="#f13232"
        android:textSize="22dp" />

    <Button
        android:id="@+id/button_pull"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="PULL解析"
        android:textColor="#fc7711"
        android:textSize="22dp" />

    <ListView
        android:id="@+id/list_view"
        android:layout_width="356dp"
        android:layout_height="437dp"
        android:layout_marginBottom="8dp"
        android:layout_marginTop="8dp">
    </ListView>

</android.support.constraint.ConstraintLayout>
然后修改 MainActivity 代码如下:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private Button mButtonDom;
    private Button mButtonSax;
    private Button mButtonPull;
    private ListView mListView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
    }

    private void initView() {
        mButtonDom = (Button) findViewById(R.id.button_dom);
        mButtonSax = (Button) findViewById(R.id.button_sax);
        mButtonPull = (Button) findViewById(R.id.button_pull);
        mListView = (ListView) findViewById(R.id.list_view);

        mButtonDom.setOnClickListener(this);
        mButtonSax.setOnClickListener(this);
        mButtonPull.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.button_dom:

                break;
            case R.id.button_sax:

                break;
            case R.id.button_pull:

                break;
        }
    }
}

可以看到我们在这里面找到了个控件,并为三个按钮分别添加了点击监听器。

接着,我们在assets目录下定义三个用于解析的XML源文件,分别为:
  • person1:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <person id = "10">
        <name>Dom解析</name>
        <age>16</age>
    </person>
    <person id = "13">
        <name>WillFlow1</name>
        <age>18</age>
    </person>
</persons>
  • person2:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <person id = "11">
        <name>Sax解析</name>
        <age>18</age>
    </person>
    <person id = "13">
        <name>WillFlow2</name>
        <age>17</age>
    </person>
</persons>
  • person3:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <person id = "11">
        <name>PULL解析</name>
        <age>18</age>
    </person>
    <person id = "13">
        <name>WillFlow3</name>
        <age>16</age>
    </person>
</persons>
最后,我们定义一个Person数据类,用于解析数据的模板:
public class Person {
    private int id;
    private String name;
    private int age;

    public Person() {

    }

    public Person(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "姓名 : " + this.name + ", 年龄 : " + this.age;
    }
}

准备工作就这样做好了,接下来我们分别用三种方法进行解析吧。

2、实现DOM解析

我们定义一个DOMHelper解析类,代码如下:
/**
 * Created by   : WGH.
 */
public class DomHelper {
    public static ArrayList<Person> queryXML(Context context) {
        ArrayList<Person> Persons = new ArrayList<Person>();
        try {
            // 获得DOM解析器的工厂示例
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            // 从Dom工厂中获得dom解析器
            DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();
            // 把要解析的xml文件读入Dom解析器
            Document document = dbBuilder.parse(context.getAssets().open("person1.xml"));
            Log.i(TAG, "DomImplemention : " + document.getImplementation());
            // 得到文档中名称为person的元素的结点列表
            NodeList nodeList = document.getElementsByTagName("person");
            // 遍历该集合,显示集合中的元素以及子元素的名字
            for (int i = 0; i < nodeList.getLength(); i++) {
                // 先从Person元素开始解析
                Element personElement = (Element) nodeList.item(i);
                Person person = new Person();
                person.setId(Integer.valueOf(personElement.getAttribute("id")));

                // 获取person下的name和age的Note集合
                NodeList childNoList = personElement.getChildNodes();
                for (int j = 0; j < childNoList.getLength(); j++) {
                    Node childNode = childNoList.item(j);
                    // 判断子note类型是否为元素Note
                    if (childNode.getNodeType() == Node.ELEMENT_NODE) {
                        Element childElement = (Element) childNode;
                        if ("name".equals(childElement.getNodeName()))
                            person.setName(childElement.getFirstChild().getNodeValue());
                        else if ("age".equals(childElement.getNodeName()))
                            person.setAge(Integer.valueOf(childElement.getFirstChild().getNodeValue()));
                    }
                }
                Persons.add(person);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return Persons;
    }
}

可以看到,我们在这里首先获得了DOM解析器的工厂示例,并从工厂示例中获得了dom解析器,最后把要解析的xml文件读入Dom解析器,解析的过程如代码中的注释所示。

然后在 MainActivity 中的电机监听器中添加如下代码进行解析和展示:
                DomHelper domHelper = new DomHelper();
                mPersonArrayList = domHelper.queryXML(getApplicationContext());
                mAdapter = new ArrayAdapter<Person>(MainActivity.this, android.R.layout.simple_expandable_list_item_1, mPersonArrayList);
                mListView.setAdapter(mAdapter);
编译运行看效果

3、实现SAX解析

我们定义一个SAXHelper解析类,代码如下:
/**
 * Created by   : WGH.
 */
public class SaxHelper extends DefaultHandler {
    private Person mPerson;
    private ArrayList<Person> personArrayList;
    // 当前解析的元素标签
    private String tagName = null;

    /**
     * 当读取到文档开始标志是触发,通常在这里完成一些初始化操作
     */
    @Override
    public void startDocument() throws SAXException {
        this.personArrayList = new ArrayList<Person>();
        Log.i(TAG, "读取到文档头,开始解析XML");
    }

    /**
     * 读到一个开始标签时调用,第二个参数为标签名,最后一个参数为属性数组
     */
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if (localName.equals("person")) {
            mPerson = new Person();
            mPerson.setId(Integer.parseInt(attributes.getValue("id")));
            Log.i(TAG, "开始处理person元素");
        }
        this.tagName = localName;
    }


    /**
     * 读到到内容,第一个参数为字符串内容,后面依次为起始位置与长度
     */
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        // 判断当前标签是否有效
        if (this.tagName != null) {
            String data = new String(ch, start, length);
            // 读取标签中的内容
            if (this.tagName.equals("name")) {
                this.mPerson.setName(data);
                Log.i(TAG, "处理name元素内容");
            } else if (this.tagName.equals("age")) {
                this.mPerson.setAge(Integer.parseInt(data));
                Log.i(TAG, "处理age元素内容");
            }

        }

    }

    /**
     * 处理元素结束时触发,这里将对象添加到结合中
     */
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if (localName.equals("person")) {
            this.personArrayList.add(mPerson);
            mPerson = null;
            Log.i(TAG, "处理person元素结束");
        }
        this.tagName = null;
    }

    /**
     * 读取到文档结尾时触发,
     */
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
        Log.i(TAG, "读取到文档尾,XML解析结束");
    }

    // 获取persons集合
    public ArrayList<Person> getPersonArrayList() {
        return personArrayList;
    }
}
然后定义这样一个方法用于SAX方式解析:
    private ArrayList<Person> readxmlBySAX() throws Exception {
        // 获取文件资源建立输入流对象
        InputStream inputStream = getAssets().open("person2.xml");
        // 创建XML解析处理器
        SaxHelper saxHelper = new SaxHelper();
        // 得到SAX解析工厂
        SAXParserFactory factory = SAXParserFactory.newInstance();
        // 创建SAX解析器
        SAXParser parser = factory.newSAXParser();
        // 将xml解析处理器分配给解析器,对文档进行解析,将事件发送给处理器
        parser.parse(inputStream, saxHelper);
        inputStream.close();
        return saxHelper.getPersons();
    }
最后再点击监控器里面这样使用:
                try {
                    mPersonArrayList = readxmlBySAX();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                mAdapter = new ArrayAdapter<Person>(MainActivity.this, android.R.layout.simple_expandable_list_item_1, mPersonArrayList);
                mListView.setAdapter(mAdapter);
运行开效果

4、实现PULL解析

首先,我们实现一个帮助类代码如下:
/**
 * Created by   : WGH.
 */
public class PullHelper {
    public static ArrayList<Person> getPersons(InputStream xml) throws Exception {
        // XmlPullParserFactory pullPaser = XmlPullParserFactory.newInstance();
        ArrayList<Person> personArrayList = null;
        Person person = null;
        // 创建一个xml解析的工厂
        XmlPullParserFactory pullParserFactory = XmlPullParserFactory.newInstance();
        // 获得xml解析类的引用
        XmlPullParser parser = pullParserFactory.newPullParser();
        parser.setInput(xml, "UTF-8");
        // 获得事件的类型
        int eventType = parser.getEventType();
        while (eventType != XmlPullParser.END_DOCUMENT) {
            switch (eventType) {
                case XmlPullParser.START_DOCUMENT:
                    personArrayList = new ArrayList<Person>();
                    break;
                case XmlPullParser.START_TAG:
                    if ("person".equals(parser.getName())) {
                        person = new Person();
                        // 取出属性值
                        int id = Integer.parseInt(parser.getAttributeValue(0));
                        person.setId(id);
                    } else if ("name".equals(parser.getName())) {
                        String name = parser.nextText();// 获取该节点的内容
                        person.setName(name);
                    } else if ("age".equals(parser.getName())) {
                        int age = Integer.parseInt(parser.nextText());
                        person.setAge(age);
                    }
                    break;
                case XmlPullParser.END_TAG:
                    if ("person".equals(parser.getName())) {
                        personArrayList.add(person);
                        person = null;
                    }
                    break;
            }
            eventType = parser.next();
        }
        return personArrayList;
    }

    public static void saveXML(List<Person> persons, OutputStream out) throws Exception {
        XmlSerializer serializer = Xml.newSerializer();
        serializer.setOutput(out, "UTF-8");
        serializer.startDocument("UTF-8", true);
        serializer.startTag(null, "persons");
        for (Person p : persons) {
            serializer.startTag(null, "person");
            serializer.attribute(null, "id", p.getId() + "");
            serializer.startTag(null, "name");
            serializer.text(p.getName());
            serializer.endTag(null, "name");
            serializer.startTag(null, "age");
            serializer.text(p.getAge() + "");
            serializer.endTag(null, "age");
            serializer.endTag(null, "person");
        }
        serializer.endTag(null, "persons");
        serializer.endDocument();
        out.flush();
        out.close();
    }
}
然后再 MainActivity 的电击监听器里面这样定义代码:
                // 获取文件资源建立输入流对象
                try {
                    InputStream is = getAssets().open("person3.xml");
                    mPersonArrayList = PullHelper.getPersons(is);
                    if (mPersonArrayList == null) {
                        Toast.makeText(getApplicationContext(), "读取出错!", Toast.LENGTH_SHORT).show();
                    }
                    for (Person p1 : mPersonArrayList) {
                        Log.i(TAG, p1.toString());
                    }
                    mAdapter = new ArrayAdapter<Person>(MainActivity.this, android.R.layout.simple_expandable_list_item_1, mPersonArrayList);
                    mListView.setAdapter(mAdapter);
                } catch (Exception e) {
                    e.printStackTrace();
                }
编译运行看效果

注意:我们这里定义了一种写入数据的方法,你可以在需要的时候这样使用:

    private void saveFileByPull() {
        List<Person> persons = new ArrayList<Person>();
        persons.add(new Person(66, "WillFLow1", 16));
        persons.add(new Person(77, "WillFLow2", 17));
        persons.add(new Person(88, "WillFLow3", 18));
        File xmlFile = new File(getApplicationContext().getFilesDir(), "WillFlow.xml");
        FileOutputStream fileOutputStream;
        try {
            fileOutputStream = new FileOutputStream(xmlFile);
            PullHelper.saveXML(persons, fileOutputStream);
            Toast.makeText(getApplicationContext(), "文件写入完毕", Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            e.printStackTrace();
        }   
    }

点此进入:GitHub开源项目“爱阅”,下面是“爱阅”的效果图:


联系方式:

简书:WillFlow
优快云:WillFlow
微信公众号:WillFlow

微信公众号:WillFlow

Android XML文件读取解析三种方式 XML文件读取解析 阅读详情

相关推荐

强化学习新手上路:用PPO-Clip轻松玩转Pendulum-v1(PyTorch保姆级教程)

本文提供了一份基于PyTorch的PPO-Clip算法实战教程,指导强化学习新手在Pendulum-v1环境中构建连续控制智能体。教程详细解析了PPO-Clip的核心机制,特别是其Clip机制如何限制策略更新幅度以确保训练稳定,并涵盖了从环境配置、策略网络设计、经验收集到完整训练框架搭建的全过程,是掌握连续动作空间强化学习的实用指南。

weixin_29062963的博客 270

XML 解析

XML 定义 XML,即 extensible Markup Language ,是一种数据标记语言 & 传输格式 作用 对数据进行标记(结构化数据)、存储 & 传输 特性 灵活性: 可自定义标签,文档结构 自我描叙性 XML文档即 一个纯文本文件,代码结构清晰,适合人类阅读 有文本处理能力的软件都可以处理XML 可扩展性: 可在不中断解析,应用程序的情况下进行扩展 可跨平...

尹东生的博文(Indson) 692

4. PCIe 接口时序

在上一篇中,大致介绍IPcore接口。总的来说接口如下图数据的接收和发送通过transmitTLPinterface和ReceiveTLPinterface。收发数据的时序也只是描述这几个接口的关系。从手册上截取PCIex1的接口时序。

jjinl的专栏 6122

解析xml三种方式

一个dom的解析器在解析一个xml文档的时候,一次性读取整个文档,把文档中的所有元素保存在内存中的一个树结构里面,可以利用dom提供不同函数来读取或修改文档的内容和结构,也可以把修改过的内容写入到xml文件中。startElement(name,attrs):遇到xml开始标签时调用,name是标签的名字,attrs是标签的属性,解析器:负责读取xml文件,并向时间处理器发送相应的处理事件,处理事件包括:元素开始事件和元素结束事件。注意:标签可以是开始标签,也可以是结束标签。

qq_61986535的博客 1888

CMOS反相器版图设计全解析:PMOS/NMOS布局与VDD/VSS连接门道

版图设计是芯片从电路原理图迈向物理实现的必经桥梁,而CMOS反相器作为最基础的数字单元,恰好是理解这一过程的最佳切入点。在版图绘制中,PMOS与NMOS因导电类型和迁移率差异,需要在N阱与P衬底上分别规划,并呈现出不同的有源区尺寸。真正决定版图好坏的关键,往往在于VDD/VSS的完整连接——不仅要接通源漏,还要通过阱接触和衬底接触固定阱与衬底电位,防止寄生PN结正偏和闩锁效应。合理布局电源地线轨道、优化接触孔数量,能显著降低寄生电阻与电迁移风险。这些原理不仅适用于反相器,也是所有CMOS数字标准单元版图设计

weixin_29159441的博客 302

基于Codex与Skills的学术研究自动化全流程实战指南

还在为海量文献下载、整理、阅读和综述写作而头疼吗?面对堆积如山的PDF,你是否感到无从下手?从选题、文献检索、到写作、绘图、润色,再到应对AI检测和审稿意见,学术研究的每一步都充满挑战。本文将为你带来一套堪称“王炸组合”的解决方案: Codex + Skills 。这不是简单的工具介绍,而是一套从零开始,覆盖学术研究全流程的保姆级实战教程。我们将手把手教你如何安装、配置,并利用强大的Skills(技能)自动化处理文献下载管理、高效撰写综述、生成专业图表、智能润色降重,直至应对审稿。无论你是科研新手还是希望提

weixin_29041195的博客 764

Xml数据解析的三种方式

一概述 xml作为一种数据交互格式,涉及到xml数据的生成与解析,这里讲述Java内置的xml的基本解析。二、编写思路 1、创建解析器工厂对象(DocumentBuilderFactory对象) 2、创建解析器对象 3、创建Document对象例如解析下述文件<?xml version="1.0" encoding="utf-8"?> <students> <stud

情诗少年的博客 853

[nlp] 自然语言理解基准 ATIS Snips

ATIS 4k 21 Intents(not include UNK) 120 SlotsSNIPS 13k 7 Intents(not include UNK) 72 SlotsATIS Benchmark (Intent Detection) | Papers With CodeSNIPS Benchmark (Intent Detection) | Papers With Code

心宝的博客 747

xml的三种解析方法

Xml主要有三种解析方式分别为dom、sax、还有xmlpull,先来说下各自的优缺点。 1、dom解析的特点是将整个xml文档以树形结构放入到内存中,是官方推荐标准,优点是在内存中可以增删改查,缺点是当文件过大是可能会内存溢出。 2、sax解析是一行一行的进行解析,是程序员社区开发出来的,优点是不会内存溢出,缺点是不能修改里面的内容 3、xmlpull的解析类似sax解析,是android...

郝的博客 1883

【视频监控国标GB/T28181】无人机的视频图传技术

然而,随着无人机市场的不断发展和无人机视频图传技术的迅速进步,一些厂家正积极探索更多的传输方式。如今,一些大疆无人机已经具备了4G辅助图传功能,这意味着它们需要在无人机上安装相应的SIM卡,并在有移动互联网信号的情况下,通过互联网进行视频图传。这种技术的应用,不仅提高了无人机的操作灵活性,也使得无人机在各个领域的应用更加广泛。在使用时,用户需时刻注意无人机的飞行距离。在无人机图传系统中,OFDM技术的运用更是如虎添翼,显著增强了视频传输的品质与稳定性,尤其在错综复杂的电磁环境中,更能凸显其不可替代的优势。

开源物联网项目商业化作者 5662

OpenCV实战系列——图像线条提取

基于内容的图像分析,需要从构成图像的像素集合中提取有意义的特征。轮廓、线条、区域等是基本的图像基元,可用于描述图像中包含的元素。本节将介绍如何提取重要的图像线条特征。

m0_58523831的博客 1万+

Java三种方式解析xml

Java里边解析xml一般有三种常用的技术:1、 Document Object Model (DOM),W3C里边一种成熟的标准。目前广泛使用的解析工具:JDOM DOM4J2、 Simple API for XML (SAX),第一种被广泛接受的XML的API,成为事实上的标准。3、 Streaming API for XML (StAX),在JSR-173中提到的一种很有前途

New World 1417

030、自动白平衡AWB实战:灰度世界、完美反射与色温估计的工程实现与局限

本文深入探讨了自动白平衡(AWB)算法在工程实践中的实现与局限性。作者结合实际项目经验,分析了灰度世界算法、完美反射算法和色温估计三种主流方法的优缺点和适用场景,并分享了调试过程中的关键技巧和常见陷阱。文章指出,纯色背景、多光源环境等特殊场景容易导致算法失效,需要通过混合策略和场景检测来优化。作者强调AWB调试需要大量实际场景测试,建议保留手动调节功能,并针对不同硬件配置进行参数标定。最后提出,AWB优化是一个持续迭代的过程,需要工程化的测试方法和数据处理能力。

zzfmlxs的博客 282

关于爬虫解析数据的4种方式

爬虫之解析数据的4种方式:XPath解析数据、BeautifulSoup解析数据、正则表达式、pyquery解析数据。

米兔-miny的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java xml三种解析,Xml的三种解析方式

XML的三种解析方式:DOM、SAX、PULL解析废话不说上代码:packagecom.minimax.xmlparsedemo;importjava.io.InputStream;importjava.util.List;importandroid.os.Bundle;importandroid.app.Activity;importandroid.content.res.Asset...

weixin_34175978的博客 303

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Qt 三种解析xml的方式

Qt 三种解析xml的方式

m0_73443478的博客 1570

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

解析xml的4种方法详解

1. 介绍 1)DOM(JAXP Crimson解析器)          DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。DOM以及广义的基于树的处理具有几

jzhf2012的专栏 8万+

Java解析XML的4大方式

文章目录一、什么是XML?二、XML的优势(一)、XML的特性1、XML具有平台无关性2、XML具有自我描述性(二)、XML的用处1、网络数据传输2、 数据存储3、配置文件(最常用)三、XML的语法格式(一)、XML文档声明(二)、一个XML文档中有且且仅允许有一个根标记(三)、标记名称命名规范(四)、含有属性的XML标记案例(五)、注释(六)、CDATA四、4种解析方式(一)、SAX解析1、优点2、缺点(二)、DOM解析1、优点2、缺点(三)、JDOM解析(四)、DOM4J解析五、DOM4J解析本地XM.

haohaoxuexiyai的博客 1842

XML数据的三种解析方式

Android开发主流是传json,而XML解析一般跟网络请求,爬虫数据相关。 一丶概述 文件解析要求,json解析和xml解析,前面文章说过Json转实体类,这里就说说解析XML 内容: 在Android中提供了三种解析XML的方式:DOM(Document Objrect Model),SAX(Simple API XML),以及Android推荐的Pull解析方式。 如图: SAX(S...

qq_32534441的博客 1678

XML的解析方式

XML的解析方式有: (1)DOM解析方法,可以对XML文档进行修改操作; (2)SAX解析方法,解析速度快,占用内存少; (3)JDOM解析方法,查找方便; (4)DOM4J解析方法,解析XML的速度快; 1.XML简介 XML即可扩展的标记语言,可以定义语义标记(标签),是元标记语言。XML不像超文本标记语言HTML,HTML只能使用规定的标记,对于XML,用户可以定义自己需要的标记。 XML文档以层级标签的形式来组织数据,多用于配置文件、存储静态数据、交换数据。 2.XML语法 1.

qq_41316200的博客 8870

XML解析——Java中XML的四种解析方式

XML是一种通用的数据交换格式,它的平台无关性、语言无关性、系统无关性、给数据集成与交互带来了极大的方便。XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已。   XML的解析方式分为四种:1、DOM解析;2、SAX解析;3、JDOM解析;4、DOM4J解析。其中前两种属于基础方法,是官方提供的平台无关的解析方式;后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于java平台。   针对以下XML文件,会对四种方式进行详细描述: <?xml version="1.0

qq_37272886的博客 4202

解析XML的三种方法详解

1.     简介XML  XML:可扩展性标记语言(用户可以自定义标签)。 2.     HTML:超文本标记语言(超出文本表示的范围) 3.     XML的用途: (1)    存储和传输数据 (2)     作为小型的数据库使用 (3)     保存项目的一些配置文件 4.     在表示非常复杂的数据时,一般采用XML或者json 5.     XML语法规则: 1,

W1365966490的专栏 896

XML解析各种方式比较(1)

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

2401_84415534的博客 935

Android XML数据的三种解析方式(SAX解析)

在 Android中解析XML文主要有三种方式,分别为SAX、DOM和Android附带的PULL解析器。其中SAX是一个解析速度非常快并且占用内存少的XML解析器,非常适合Android手机等移动设备。 SAX解析XML文件采用事件驱动的方式进行,也就是说,SAX是逐行扫描文件,遇到符合条件的设定条件后就会触发特定的事件,回调你写好的事件处理程序。使用SAX的优势在于其解析速度较快,...

qinxuexiang_blog的博客 562

XML解析之SAX方式

XML解析之SAX方式解析xml文件 SAX解析方式会逐行地去扫描XML文档,当遇到标签时会触发解析处理器,采用事件处理的方式解析XML (Simple API for XML) ,不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。优点是:在读取文档的同时即可对XML进行处理,不必等到文档加载结束,相对快捷。不需要加载进内存,因此不存在占用内存的问题,可以解析超大XML。缺点是:只能用来读取XML中数据,无法进行增删改。 SAX解析可分四个步骤进行: 1、得到xml文

Fisher 2891
上一篇: 3.3 基于 Socket 协议的网络通信详解
下一篇: 4.2 JSONObject 和 GSON 解析 JSON 数据详解
WillFlow
博客等级 码龄11年 61粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值