xml入门、解析、创建及规范

来源:互联网 发布:apk优化 编辑:程序博客网 时间:2024/05/21 04:20


HTML&XML

HtmlXML都属于SGML(标准通用标记语言)语言分支

程序型标记-HTMLHTML5不属于SGML分支)  XHTML

描述型标记-XML-(1998正式形成标准)

两者都由W3C维护

 

XMLExtensiable Markup Language可扩展标记语言,xml只代表数据本身,而不包含任何样式结构的呈现,所以也称之为一种数据描述语言

Xml作用:

1.实现不同平台之间的数据交换(webservice:soap协议)

2.Xml还可以用于一些应用程序的配置文件(框架,tomcatservlet)

XML文档构成

一个标准的XML文档由3个部分构成

1.xml指令<?xml version=1.0 encoding=utf-8 standalone="yes"?>

2.文档类型定义<!DOCTYPE >

3.文档元素部分

 

 

Xml指令主要描述xml版本(目前为1.0),编码,文档类型定义是否是一个独立文件

文档类型定义(DTDXSD):规范文档中允许出现的标记,属性,以及标记之间关系

文档的详细构成部分:标签,属性,文本

 

Xml元素:由一对标签以及标签对之间的内容构成

Xml标签:主要包含开始标记以及结束标记

Xml属性:属性通常定义在元素的开始标记中

 

CDATA:元数据

<![CDATA[

    元数据具体内容

]]>

 

命名空间:namespace,防止标签的命名冲突

 

<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
    <h:td>Apples</h:td>
    <h:td>Bananas</h:td>
</h:tr>

</h:table>

 

<f:table xmlns:f="http://www.w3schools.com/furniture">
    <f:name>African Coffee Table</f:name>
    <f:width>80</f:width>
    <f:length>120</f:length>
</f:table>

 

 

XML规范

Xml规范相对HTML来说相当严格

1.标记必须成对出现(空标签例外)

2.标签严格区分大小写

3.属性值必须使用双引号包含

4.属性值中不能包含特殊符号(<,&...)

5.xml支持类似html中实体(< > ")

6.注释代码不允许嵌套

7.一个XML文档中有且只有一对根节点

 

 

 

JSON&XML

AJAX:异步的javascript and XML

JSON:是一种轻量级的数据交换格式,实现不同平台之间的数据交换

 

 

XML解析

1.DOM解析

  将需要被解析的文档完整的加载到内存中,解析为一颗倒置的文档树,可以通过解析器任意获取文档树中的节点

  优点:适合解析较小的文档,解析速度快,可以任意搜索节点,并行搜索

  缺点:一次性加载的整个文档,会消耗大量内存,无法解析过大的文件

2.SAX解析

 基于事件驱动的方式以类似流媒体的方式进行解析,在读取到一部分内容之后立即开始解析,直到读取到文档结束标记后停止解析

  优点:适合解析较大的文档,解析效率较快,一边读取一边解析

  缺点:无法任意搜索节点,比较难以实现并行搜索

3.JDOM解析

JDOM的目的是成为java特定文档模型,它简化与xml的交互并且比使用DOM实现更快

4.DOM4J解析

 DOM4J是一个非常优秀的java xml API,具有性能优异、功能强大和极端易用的特点

Android pull解析


案列分析

package com.softeem.xml.create;import java.io.File;import java.io.FileWriter;import java.io.IOException;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.XMLWriter;public class CreateXML {public static void main(String[] args) throws IOException {
        //创建一个文档对象Document document = DocumentHelper.createDocument();
        //创建根节点Element root = document.addElement("books");Element book = root.addElement("book").addAttribute("no", "123234");book.addElement("name").setText("恒大华府");book.addElement("author").setText("安徽分行的");book.addElement("price").setText("45.7");book.addElement("publish").setText("方法");OutputFormat fmt = new OutputFormat().createPrettyPrint();fmt.setEncoding("gbk");File file = new File("src/bk.xml");FileWriter fw = new FileWriter(file);XMLWriter writer = new XMLWriter(fw, fmt);writer.write(document);writer.flush();writer.close();}}<?xml version="1.0" encoding="gbk"?><books>  <book no="123234">    <name>恒大华府</name>    <author>安徽分行的</author>    <price>45.7</price>    <publish>方法的继承</publish>  </book></books>
DOM解析
package com.softeem.xml.parse;import java.io.File;import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document;import org.w3c.dom.NamedNodeMap;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;public class ParseByDOM {public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {//实例化一个解析工厂DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();        //获取解析器对象DocumentBuilder builder = factory.newDocumentBuilder();       //解析文件并获取文档对象Document document = builder.parse(new File("src/userinfo.xml"));//根据元素的标签获取元素并去取出匹配第一个元素Node root = document.getElementsByTagName("users").item(0);NodeList list = root.getChildNodes();//System.out.println(node); for(int i = 0;i < list.getLength();i++){Node n = list.item(i);if("user".equals(n.getNodeName())){NamedNodeMap nnm = n.getAttributes();String id = nnm.getNamedItem("id").getNodeValue();System.out.println(id+"==");//继续搜索user节点的子节点NodeList user_child = n.getChildNodes();System.out.println(user_child.getLength());for(int j = 0;j < user_child.getLength();j++){Node c = user_child.item(j);if("name".equals(c.getNodeName())){String name = c.getTextContent();System.out.println(name+"姓名");}else if("sex".equals(c.getNodeName())){String sex = c.getTextContent();System.out.println(sex+"姓名");}else if("age".equals(c.getNodeName())){String age = c.getTextContent();System.out.println(age+"姓名");}else if("ismarray".equals(c.getNodeName())){String ismarray = c.getTextContent();System.out.println(ismarray+"姓名");}}}}}}
SAX解析
package com.softeem.xml.parse;import java.io.IOException;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;import com.softeem.xml.dto.Book;public class ParseBySAX extends DefaultHandler {public List<Book> books;private Book book;private String nowTag;@Overridepublic void startDocument() throws SAXException {System.out.println("开始解析");books = new ArrayList<>();}/** * uri:命名空间的uri地址 * localName:不带命名空间前缀的标签名称 * qName:包含命名空间的标签名 * attributes:元素中的属性列表 */@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {System.out.println("读取开始标记:"+qName);//记录当前标记nowTag = qName;if("book".equals(qName)){book = new Book();book.setNo(attributes.getValue("no"));}}@Overridepublic void characters(char[] c, int start, int length) throws SAXException {System.out.println("读取到文本节点:"+new String(c,start,length));String value = new String(c,start,length);//根据标记给值if("name".equals(nowTag)){book.setName(value);}else if("author".equals(nowTag)){book.setAuthor(value);}else if("price".equals(nowTag)){book.setPrice(value);}else if("publish".equals(nowTag)){book.setPublish(value);}//将节点置空nowTag = "";}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {System.out.println("读取到结束标记:"+qName);if("book".equals(qName)){books.add(book);book = null;}}@Overridepublic void endDocument() throws SAXException {System.out.println("解析结束");}public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {SAXParser parse = SAXParserFactory.newInstance().newSAXParser();ParseBySAX pbs = new ParseBySAX();parse.parse("src/bookinfo.xml",pbs);List<Book> list = pbs.books;System.out.println(list);}}
DOM4J解析
package com.softeem.xml.parse;import java.io.File;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;public class ParseByDOM4J {public static void main(String[] args) throws DocumentException {// 创建dom4j解析器SAXReader reader = new SAXReader();// 解析文档Document document = reader.read(new File("src/bookinfo.xml"));//获取根节点Element root = document.getRootElement();//获取当前根节点下指定名称的子节点List<Element> list = root.elements("book");for (Element e : list) {String no = e.attributeValue("no");String name = e.element("name").getText();String author = e.element("author").getText();String price = e.element("price").getText();String publish = e.element("publish").getText();System.out.println(no);System.out.println(name);System.out.println(author);System.out.println(publish);System.out.println(price);System.out.println("============");}}}
DOM4J_XPath解析
package com.softeem.xml.parse;import java.io.File;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Node;import org.dom4j.io.SAXReader;public class ParseByDOM4J_XPath {public static void main(String[] args) throws DocumentException {SAXReader reader = new SAXReader();Document document = reader.read(new File("src/bookinfo.xml"));    //快速搜索books/book/name节点List<Node> list = document.selectNodes("books/book/name");    for(Node n:list){    String qname = n.getName();    String name = n.getText();    System.out.println(qname+"---"+name);    }   List<Node> list2 =  document.selectNodes("books/book");    for(Node n2:list2){    //获取节点的指定属性    String no = n2.valueOf("@no");    System.out.println(no+"----");    }}}
JDOM解析
package com.softeem.xml.parse;import java.io.IOException;import java.util.List;import org.jdom.Document;import org.jdom.Element;import org.jdom.JDOMException;import org.jdom.input.SAXBuilder;public class ParseByJDOM {public static void main(String[] args) throws JDOMException, IOException {//创建解析器SAXBuilder builder = new SAXBuilder();//解析document对象Document document = builder .build("src/bookinfo.xml");        //获取文档的根节点document.getRootElement();Element root = document.getRootElement();//获取根节点的所有的List<Element> list = root.getChildren("book");for(Element e:list){String no = e.getAttributeValue("no");String name = e.getChild("name").getText();String author = e.getChild("author").getText();String publish = e.getChild("publish").getText();String price = e.getChild("price").getText();System.out.println(no);System.out.println(name);System.out.println(author);System.out.println(publish);System.out.println(price);System.out.println("============");}}}





原创粉丝点击