• XML解析


    XML介绍
    XML: extensible markup language, 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。非常适合 Web 传输,常用来存储数据。
    XML文件在Java的各种框架设计中应用非常广泛,常用来解藕。
    在XML中,采用了如下的语法:
    1、任何的起始标签都必须有一个结束标签。
    2、可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签。这种语法是在大于符号之前紧跟一个斜线(/),例如<tag/ >。XML解析器会将其翻译成<tag></tag>。
    3、标签必须按合适的顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签,例如this is a samplestring。这好比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有的内部括号之前,是不能关闭外面的括号的。
    4、所有的属性都必须有值。
    5、所有的属性都必须在值的周围加上双引号。

    XML解析概述
    XML技术是Android平台的应用基础,Android提供了多种解析XML的方式。以下将介绍:SAX解析、DOM解析、PULL解析和JSON解析。

    SAX解析XML
    1.概述
    SAX是Simple API for XML(XML简单的API)的缩写,SAX是一个解析速度快,占用内存少的XML解析器,并且SAX提供了一组简单的API用于解析XML文件。
    SAX在解析XML文件前,先指定一个解析事件处理器(Handler),解析开始后,SAX 会对XML文档进行简单的顺序扫描,当扫描到文档(Document)的开始和结束,还有元素Element的开始和标记Tag的开始和结束时,会给之前指定的解析事件处理器发送消息,由处理器来处理相应的事件。当XML文档扫描完毕,则整个解析过程结束。
    2.相关类/接口
    1、javax.xml.parsers包下的类/接口:
    1)SAXParserFactory类:SAX解析器工厂类,用于创建SAX解析器实例。
    2)SAXParser:SAX解析器,用于对XML文档进行解析。
    3)ParserConfigurationException:解析器配置异常。
    2、org.xml.sax包下的类/接口:
    1)Attributes接口:用于获取XML的属性值。
    2)SAXException:封装了一个通用的SAX错误警告
    3、org.xml.sax.helpers包下的接口:
    1)DefaultHandler类:SAX解析事件处理器。
    3.常用方法
    1、SAXParserFactory.newInstance();
    作用:创建SAXParserFactory工厂对象。
    2、SAXParserFactory.newSAXParser();
    作用:创建SAXParser解析器对象。
    3、DefaultHandler.startDocument()
    作用:XML文档开始处触发本方法。
    4、DefaultHandler.endDocument()
    作用:XML文档结束时触发本方法。
    5、DefaultHandler.startElement(String uri, String localName, String qName,
          Attributes attributes)
    作用:元素开始处触发本方法。
    参数:
    (1)uri:命名空间。
    (2)localName:不带命名空间的标签名。
    (3)qName:带命名空间的标签名。
    (4)attributes:所有属性和属性值。
    6、DefaultHandler.endElement(String uri, String localName, String qName);
    作用:元素结束时触发本方法。
    7、DefaultHandler.characters(char[] ch, int start, int length);
    作用:读到元素内容时,触发本方法。
    参数:
    (1)-ch:内容。
    (2)-start:数组元素的位置。
    (3)-length:数组长度
    4.使用步骤
    步骤1、创建SAX解析器的工厂对象,示例代码:
    SAXParserFactory factory = SAXParserFactory.newInstance();
    步骤2、创建SAX解析器对象,示例代码:
    SAXParser saxParse = factory.newSAXParser();
    步骤3、创建并打开输入流对象,示例代码:
    InputStream is = getAssets().open("strings.xml");
    提示:以上打开的是assets/string.xml。assets文件夹中存放的资源不会在R.java中创建资源索引值,这与res文件夹不同。
    步骤4、创建SAX事件处理器对象
    DefaultHandler dh = new DefaultHandler() {
    //重写该类中的方法
    public void startElement(String uri, String localName,
    String qName, Attributes attributes throws SAXException {
    super.startElement(uri, localName, qName, attributes);
    //在此处编写代码
    }
    @Override
    public void characters(char[] ch, int start, int length)
    throws SAXException {
    super.characters(ch, start, length);
    //在此处编写代码
    }
    }
    步骤5、解析器调用dh事件对象解析输入流代表的XML文件
    saxParse.parse(is, dh);

    DOM解析XML
    1. 概述
    DOM(Document Object Model)是文档对象模型的缩写,DOM提供了一套用于解析XML文档的API,DOM会按照XML定义的标记块来创建对象实例并设置相应的属性,而且还可按照标记块的层次结构来构建对象的层次结构。
    2.相关类/接口
    Android提供了javax.xml.parsers和org.w3c.dom两个包用于DOM方式解析XML文档。
    1、DocumentBuilderFactory类:DOM文档解析器的工厂类,用于创建解析器对象。
    2、DocumentBuilder类:DOM文档解析器类,用于解析XML文档。
    3、Document:文档实体接口。
    4、Element类:代表文档的一个元素。
    5、Node类:代表DOM模型中的实体的主要数据类型,既可以是元素也可以是属性项。
    6、NodeList类:节点列表。
    3. 常用方法
    1、DocumentBuilderFactory.newInstance();
    作用:创建文档模型工厂对象。
    2、DocumentBuilderFactory. newDocumentBuilder();
    作用:创建解析器对象。
    3、DocumentBuilder.parse(InputStream is);
    作用:将输入流代表的XML文档加载到内存中。
    4、DocumentBuilder.getDocumentElement();
    作用:获得根元素。
    5、Element.getChildNodes();
    作用:获得当前元素的所有子节点元素。该方法返回一个NodeList类型的对象。
    6、NodeList.item(i);
    作用:返回节点列表中索引值为i的列表项。
    7、Node.getNodeType();
    作用:获得节点类型。
    8、Element.getAttribute(String s);
    作用:获得指定属性的属性名称。
    9、Element.getFirstChild().getNodeValue();
    作用:获得当前属性的数据。
    4.使用步骤
    步骤1、创建DOM解析器工厂对象,示例代码:
    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
    步骤2、创建DOM解析器对象,示例代码:
    DocumentBuilder builder=factory.newDocumentBuilder();
    步骤3、创建输入流对象,示例代码:
    InputStream is=getAssets().open("main.xml");
    步骤4、将整个XML文档加载到内存,示例代码:
    Document parse=builder.parse(is);
    步骤5、获得根元素(最外面的标签),示例代码:
    Element root=parse.getDocumentElement();
    步骤6、获得所有的子节点,示例代码:
    NodeList nodes=root.getChildNodes();
    步骤7、依次获取每个子节点
    for (int i = 0; i < nodes.getLength(); i++) {
    //7.1.获得每个子节点
    Node  item=nodes.item(i);
    //7.2.判断元素类型是否是节点
    if(Node.ELEMENT_NODE==item.getNodeType()){
    //7.2.1.将元素转换为节点
    Element element=(Element)item;
    //7.2.2.获得当前节点的所有子节点
    NodeList subNodes=element.getChildNodes();
    //7.2.3.依次获取当前各子节点
    for (int  j = 0; j < subNodes.getLength(); j++) {
    //7.2.3.1.获取当前子节点
    Node item2=subNodes.item(j);
    //7.2.3.2.若节点类型是元素
    if(Node.ELEMENT_NODE==item2.getNodeType()){
    //7.2.3.2.1转换为元素类型
    Element element2=(Element)item2;
    //7.2.3.2.2.编写完成具体任务需求的代码
    }//end if
    }//end for
    }//end if
    }//end for

    PULL解析XML
    1. 概述
    Pull解析器是一个开源的Java项目,Android系统内部解析XML文件均为此种方式。Pull 解析和 Sax 解析很相似,都是轻量级的解析。在 Android 的内核中已经嵌入了 Pull,所以不需要再添加第三方 jar包来支持 Pull。
    Pull 解析和 Sax 解析不一样的地方有:
    1)Pull 读取 XML 文件后触发相应的事件调用方法返回的是数字
    2)Pull 可以在程序中控制想解析到哪里就可以停止解析
    Android系统推荐使用Pull解析XML文档。
    2.相关类/接口
    Android提供了org.xmlpull.vl包支持PULL方式解析。以下是相关类/接口。
    1、XmlPullFactory类:解析器工厂类,用于创建解析器对象。
    2、XmlPullParser类:解析器类,用于解析XML文档。
    3. 常用方法
    1、XmlPullParser.setInput(InputStream inputStream, String inputEncoding);
    作用:设置需要解析的输入流对象。
    第一个参数-inputStream:输入流对象。
    第二个参数-inputEncoding:xml文件的编码格式
    2、int XmlPullParser.getEventType();
    作用:返回当前事件的类型值,常用事件类型值:
    (1)XmlPullParser.START_DOCUMENT 文档开始
    (2)XmlPullParser.END_DOCUMENT:文档结束
    (3)XmlPullParser.START_TAG:标签开始
    (4) )XmlPullParser.END_TAG:标签结束
    3、XmlPullParser.next();
    作用:获取下一个解析器事件。
    4、XmlPullParser.getName();
    作用:返回当前元素名。
    5、XmlPullParser.getAttributeValue(int index);
    作用:返回当前元素指定索引值的属性名。
    示例:在一个XML文件中有以下标签:
    <TextView
         android:text="text"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content ">text view
    </TextView>
    则:
    parser.getName()的值是TextView,
    parser.getAttributeValue(0)值是text
    parser.getAttributeValue(1)值是fill_parent
    parser.getAttributeValue(2)值是"wrap_content
    4.使用步骤
    步骤1、创建解析器工厂对象,示例代码:
    factory = XmlPullParserFactory.newInstance();
    步骤2、创建解析器对象,示例代码:
    XmlPullParser parser=factory.newPullParser();
    提示:创建解析器对象也可以用以下一行代码完成:
    XmlPullParser parser=Xml.newPullParser();
    步骤3、获取输入流对象,示例代码:
    InputStream is=getAssets().open("main.xml");
    步骤4、设置解析器操作的输入流对象并设置编码格式,示例代码:
    parser.setInput(is,"utf-8");
    步骤5、以下循环依次读取XML文档中的每个节点,示例代码:
    for(int type=parser.getEventType();
    type!=XmlPullParser.END_DOCUMENT;
    type=parser.next()){
    //在循环中编写获取每个XML节点的代码,例如
    String tagName=parser.getName();//获取当前节点的名称
    ……
    }

    JSON解析
    1. 概述
    JSON:JavaScript对象表示法(JavaScript Object Notation)。
    JSON 是存储和交换文本信息的语法。类似 XML。
    JSON 比 XML 更小、更快,更易解析。
    JSON采用键/值对的形式存储数据。
    JSON用{}存放一个JSON对象,示例:
    {“name”:”张兰兰”,”sex”:false,”age”:28,”}
    JSON用[]存放一个JSON数组,示例:
    "[{"name":张兰兰,"sex":false,"age":23},"+
    "{"name":李斯斯,"sex":false,"age":22},"+
    "{"name":王五五,"sex":true,"age":25}]"
    提示:”表示一个双引号。
    18.5.2.解析JSON的相关类
    1、JSONObject类:存取一个JSON对象。
    2、JSONArray类:存取一个JSON数组。
    18.5.3.常用方法
    1、JSONObject.put(String name,Object value);
    作用:存放一个键/值对,键必须是String,值可以是int、boolean、String或Object类型。
    示例:
    JSONObject jsonObject=new JSONObject();
    jsonObject.put(“name”,”张兰兰”);
    2、JSONArray.getJSONObject(int index);
    作用:获取数组中指定索引值的JSON对象。
    示例:
    String jsonStr=
    "[{"name":张兰兰,"sex":false,"age":23},"+
    "{"name":李斯斯,"sex":false,"age":22},"+
    "{"name":王五五,"sex":true,"age":25}]";
    try {
    JSONArray jsonArr=new JSONArray(jsonStr);
    JSONObject jsonObj=jsonArr.getJSONObject(2);
    mTextView.setText(jsonObj.toString());
    } catch (JSONException e) {
    e.printStackTrace();
    }

    转载链接:http://blog.csdn.net/wangliang198901/article/details/14223303

  • 相关阅读:
    W3C help
    css值解析
    css中的格式上下文Formatting Context
    css中绝对定位中的left和top属性
    事件模型
    程序员应该如何更有效率
    css的边偏移距离
    css插入框
    css中的whitespace属性
    源码安装nginx 方法二
  • 原文地址:https://www.cnblogs.com/klcf0220/p/3472150.html
Copyright © 2020-2023  润新知