zoukankan      html  css  js  c++  java
  • Java的XML解析

    XML:(eXtensible Markup Language)

    可扩展标记语言

    是一种数据格式,用于存储和传输数据

    声明一个xml文件

    <?xml version="1.0" encoding="UTF-8" ?>
    

      

    文档类型定义

    <!DOCTYPE note SYSTEM “book.dtd”>
    

      

    only:有且只有一个跟节点

    一个例子

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <note>
    <to>George</to>
    <from>John</from>
    <heading>Reminder</heading>
    <body>Don't forget the meeting!</body>
    </note>
    

      

    特殊字符

    在 XML 中,有 5 个预定义的实体引用:

    格式验证

    浏览器打开不报错,就ok

    Java的XML解析的3个方法:

    1.DOM(Document Object Model)

    文档对象模型

    xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="test">
    	<select id="findUserById" parameterType="int" resultType="com.lucas.javase.mybatis.introduction.po.User" >
    		SELECT * FROM user WHERE id = #{id}
    	</select>
    	<select id="findUserListByName" parameterType="string" resultType="com.lucas.javase.mybatis.introduction.po.User">
    		SELECT * FROM user WHERE username LIKE '%${value}%'
    	</select>
    	<insert id="insertUser" parameterType="com.lucas.javase.mybatis.introduction.po.User" useGeneratedKeys="true">
    		INSERT INTO user (username,sex,birthday,address) VALUES (#{username},#{sex},#{birthday},#{address})
    	</insert>
    </mapper>
    

    Dom.java

    static String uri="UserMapper.xml";
    public static void dom() throws ParserConfigurationException, SAXException, IOException{ //DocumentBuilderFactory是抽象类,不能实例化new DocumentBuilderFactory instance = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = instance.newDocumentBuilder(); Document document = builder.parse(uri); print(document,0); } private static void print(Node document, int i) { for (int j = 0; j < i; j++) { System.out.print(" "); } switch (document.getNodeType()) { case Node.DOCUMENT_NODE: System.out.println("DOCUMENT_NODE: "+document.getNodeName()); break; case Node.ELEMENT_NODE: System.out.println("ELEMENT_NODE: "+document.getNodeName()); break; case Node.TEXT_NODE: System.out.println("TEXT_NODE: "+document.getNodeName()+"="+document.getNodeValue()); break; case Node.ATTRIBUTE_NODE: System.out.println("ATTRIBUTE_NODE: "+document.getNodeName()+"="+document.getNodeValue()); break; case Node.CDATA_SECTION_NODE: System.out.println("CDATA_SECTION_NODE: "+document.getNodeName()+"="+document.getNodeValue()); break; case Node.COMMENT_NODE: System.out.println("COMMENT_NODE: "+document.getNodeName()+"="+document.getNodeValue()); break; default: System.out.println("NODETYPE:"+document.getNodeType()+",NODEVALUE:"+document.getNodeValue()); break; } for (Node child = document.getFirstChild(); child !=null; child=child.getNextSibling()) { print(child,i+1); } }

      

    输出

    DOCUMENT_NODE: #document
     NODETYPE:10,NODEVALUE:null
     ELEMENT_NODE: mapper
      TEXT_NODE: #text=
    	
      ELEMENT_NODE: select
       TEXT_NODE: #text=
    		SELECT * FROM user WHERE id = #{id}
    	
      TEXT_NODE: #text=
    	
      ELEMENT_NODE: select
       TEXT_NODE: #text=
    		SELECT * FROM user WHERE username LIKE '%${value}%'
    	
      TEXT_NODE: #text=
    	
      ELEMENT_NODE: insert
       TEXT_NODE: #text=
    		INSERT INTO user (username,sex,birthday,address) VALUES (#{username},#{sex},#{birthday},#{address})
    	
      TEXT_NODE: #text=
    

    缺点是:一次性加载整个dom,占用内存大,速度慢  

    2、SAX(Simple API for XML)

    XML的简单接口

    Sax.java

    public static void sax() throws ParserConfigurationException, SAXException, IOException{
    		//SAXParserFactory也是抽象类
    		SAXParserFactory instance = SAXParserFactory.newInstance();
    		SAXParser saxParser = instance.newSAXParser();
    		saxParser.parse(uri, new SaxHandler());
    	}
    

      

    SaxHandler.java

    public class SaxHandler extends DefaultHandler{
    
    	void print(Object...objects){
    		for (Object object : objects) {
    			System.out.print(object);
    			System.out.print(" ");
    		}
    	}
    	@Override
    	public void startDocument() throws SAXException {
    		System.out.println("startDocument");
    	}
    
    	@Override
    	public void endDocument() throws SAXException {
    		System.out.println("endDocument");
    	}
    
    	@Override
    	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    		System.out.println("startElement "+localName+" "+qName);
    	}
    
    	@Override
    	public void endElement(String uri, String localName, String qName) throws SAXException {
    		System.out.println("endElement "+localName+" "+qName);
    	}
    
    	@Override
    	public void characters(char[] ch, int start, int length) throws SAXException {
    		System.out.println("characters "+new String(ch,start,length));
    	}
    
    	@Override
    	public void error(SAXParseException e) throws SAXException {
    		print("error:",e);
    	}
    	
    }
    

      

    输出

    startDocument
    startElement  mapper
    startElement  select
    characters 
    		SELECT * FROM user WHERE id = #{id}
    	
    endElement  select
    startElement  select
    characters 
    		SELECT * FROM user WHERE username LIKE '%${value}%'
    	
    endElement  select
    startElement  insert
    characters 
    		INSERT INTO user (username,sex,birthday,address) VALUES (#{username},#{sex},#{birthday},#{address})
    	
    endElement  insert
    endElement  mapper
    endDocument
    

      

    流式读取dom,占用内存小,速度快,基于事件,使用事件回调处理dom

     3、Jackson

    这个一个开源XML工具

    引入依赖包,maven的pom.xml

    <dependency>
    	  <groupId>com.fasterxml.jackson.dataformat</groupId>
    	  <artifactId>jackson-dataformat-xml</artifactId>
    	  <version>2.9.0</version>
    	</dependency>
    	<dependency>
    	  <groupId>com.fasterxml.woodstox</groupId>
    	  <artifactId>woodstox-core</artifactId>
    	  <version>5.1.0</version>
    	</dependency>
    

      

     需要序列化的类

    User.java

    public class User {
    	private int id;
    	private String username;
    	private String sex;
    	private String birthday;
    	private String address;
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getUsername() {
    		return username;
    	}
    	public void setUsername(String username) {
    		this.username = username;
    	}
    	public String getSex() {
    		return sex;
    	}
    	public void setSex(String sex) {
    		this.sex = sex;
    	}
    	public String getBirthday() {
    		return birthday;
    	}
    	public void setBirthday(String birthday) {
    		this.birthday = birthday;
    	}
    	public String getAddress() {
    		return address;
    	}
    	public void setAddress(String address) {
    		this.address = address;
    	}
    	@Override
    	public String toString() {
    		return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address="
    				+ address + "]";
    	}
    	public User() {
    	}
    	public User(int id, String username, String sex, String birthday, String address) {
    		super();
    		this.id = id;
    		this.username = username;
    		this.sex = sex;
    		this.birthday = birthday;
    		this.address = address;
    	}
    }
    

      

    Jackson.java
    public class Jackson {
    
    	public static void main(String[] args) {
    		try {
    			//jacksonBean2XML();
    			jacksonXML2Bean();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    	
    	/**
    	 * POJO 转为XML
    	 * 
    	 * @throws JsonProcessingException
    	 */
    	public static void jacksonBean2XML() throws JsonProcessingException{
    //		JacksonXmlModule module = new JacksonXmlModule();
    //		module.setDefaultUseWrapper(false);
    		
    		XmlMapper xmlMapper = new XmlMapper();
    		xmlMapper.setDefaultUseWrapper(false);
    		User user=new User(1,"lucas","nan","2019-10-01","上海");
    		String xml=xmlMapper.writeValueAsString(user);
    		System.out.println(xml);
    	}
    	
    	public static void jacksonXML2Bean() throws JsonParseException, JsonMappingException, IOException{
    //		JacksonXmlModule module = new JacksonXmlModule();
    //		module.setDefaultUseWrapper(false);
    		XmlMapper xmlMapper = new XmlMapper();
    		xmlMapper.setDefaultUseWrapper(false);
    		//自动忽略无法对应pojo的字段
    		xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    		User user=xmlMapper.readValue("<User><id>1</id><username>lucas</username><sex>nan</sex><birthday>2019-10-01</birthday><address>上海</address></User>", User.class);
    		System.out.println(user);
    	}
    	
    
    }
    

      

    使用第三方的工具,更加方便,面向对象开发。

  • 相关阅读:
    inet_ntoa 的一个小问题
    获取DNS服务器的版本信息
    host_network_interfaces_slow_mode_thresholds
    10月8日至11月底考试安排
    腾讯广点通防作弊
    移动广告作弊方式及防范方式
    广告联盟常用的防作弊手续
    移动端点击作弊与激活作弊的现象与预警
    数据科学家最常用的十种算法(我准备拿这个当成学习参考)
    项目的命名规范,为以后的程序开发中养成良好的行为习惯
  • 原文地址:https://www.cnblogs.com/1906859953Lucas/p/10751339.html
Copyright © 2011-2022 走看看