澳门网络娱乐游戏平台-澳门电子游戏娱乐网址-官方直营

澳门官方赌搏网站java解析xml的三种方法

15.1  动态代理
        在那后学习Spring框架时,Spring框架有一大亚湾核发电站心绪想,正是AOP,(Aspact-Oriented-Programming 面向切面编程卡塔尔(قطر‎而AOP的原理正是Java的动态代理体制,在Java的动态代理体制中,有四个根本的类或接口,贰个是 InvocationHandler(Interface卡塔尔(英语:State of Qatar)、另叁个则是 Proxy(Class卡塔尔国,那三个类和接口是落到实处大家动态代理所不可不运用的
15.1.1 动态代理的底工
动态代理的根基 : 必须有接口
Java中应用接口来定义统生龙活虎的行为标准 : 接口.

java深入深入分析XML的两种方法

1.SAX风云深入解析

package com.wzh.sax;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

//
public class Saxhandler extends DefaultHandler {

    @Override
    public void startDocument() throws SAXException {
        System.out.println("开始解析XML文档...");
    }

    @Override
    public void endDocument() throws SAXException {
        System.out.println("结束解析XML文档...");
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // TODO Auto-generated method stub
        super.startElement(uri, localName, qName, attributes);
        System.out.println("开始解析节点["+qName+"]...");
        System.out.println("共有["+attributes.getLength()+"]个属性");
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        // TODO Auto-generated method stub
        super.characters(ch, start, length);
        String content =new String(ch,start,length);
        System.out.println(content);
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        // TODO Auto-generated method stub
        super.endElement(uri, localName, qName);
        System.out.println("结束解析XML节点...");
    }
}

  

2.Dom加载分析

package com.wzh.dom;

import java.util.Iterator;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class DomHandler {

    /*
     * 解析XML
     */
    public void read(String fileName) throws Exception {
        // 定义工厂API 使应用程序能够从XML文档获取生成DOM对象树的解析器
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 获取此类的实例之后,将可以从各种输入源解析XML
        DocumentBuilder builder = factory.newDocumentBuilder();
        // builder.parse(this.getClass().getResourceAsStream("/" + fileName));
        // Document接口表示整个HTML或XML文档,从概念上讲,它是文档树的根,并提供对文档数据的基本访问
        Document document = builder.parse(this.getClass().getResourceAsStream(
                "/" + fileName));
        // 获取根节点
        Element root = document.getDocumentElement();
        System.out.println(root.getNodeName());

        //读取database节点NodeList接口提供对节点的有序集合的抽象
        NodeList nodeList = root.getElementsByTagName("database");
        for (int i = 0; i < nodeList.getLength(); i++) {
            // 获取一个节点
            Node node = nodeList.item(i);
            // 获取该节点所有属性
            NamedNodeMap attributes = node.getAttributes();
            for (int j = 0; j < attributes.getLength(); j++) {
                Node attribute = attributes.item(j);
                System.out.println(attribute.getNodeName() + ":"
                        + attribute.getNodeValue());
            }
            //获取所有子节点数据
            NodeList childNodes=node.getChildNodes();
            for (int j = 0; j < childNodes.getLength(); j++) {
                Node childNode=childNodes.item(j);
                System.out.println(childNode.getNodeName()+":"+childNode.getNodeValue());
            }
        }
    }

    public static void main(String[] args) throws Exception {
        new DomHandler().read("data-source.xml");

    }
}

  

3.dom4j解析

 

package com.wzh.dom4j;

import java.io.FileOutputStream;
import java.sql.DatabaseMetaData;
import java.util.Iterator;
import java.util.List;

import org.dom4j.*;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class Dom4jHandler {

public void add() throws Exception {
// 1.创设一个Document
Document document = DocumentHelper.createDocument();
// 2.给Document增多数量
Element root = document.addElement("DataSource");
// 增多注释
root.addComment("这是注释消息"卡塔尔(قطر‎;
// 在root根节点下边增多二个子节点
Element database = root.addElement("database");
澳门官方赌搏网站,database.addAttribute("name", "mysql");
database.addAttribute("version", "5.0");
// 增加子节点
database.addElement("driver").setText("com.mysql.jdbc.Driver");
database.addElement("url")
.setText("jdbc:mysql://localhost:3306/myjdbc");
database.addElement("user").setText("root");
database.addElement("password").setText("root");
// 3.将Document写出文件
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
// FileOutputStream暗中认可生成的路子在根路线
XMLWriter xw = new XMLWriter(new FileOutputStream("db.xml"), format);
xw.write(document);
xw.close();
}

public void update(String fileName) throws Exception {
// sax解析器
SAXReader saxReader = new SAXReader();
// 读到对象
澳门官方赌搏网站java解析xml的三种方法。Document document = saxReader.read(this.getClass().getResourceAsStream(
"/" + fileName));
Element root = document.getRootElement();
List<Element> databases_node = root.elements("database");
for (Element database_node : databases_node) {
if (database_node.attributeValue("name").equalsIgnoreCase("mysql")) {
System.out.println("old:"

  • database_node.attributeValue("name"));
    database_node.attribute("name").setText("Oracle");
    System.out.println("update:"
  • database_node.attributeValue("name"));

database_node.element("driver").setText("oracel");
database_node.element("url").setText("jdbc");

// 删除password节点
database_node.remove(database_node.element("password"));

// 删除属性
database_node.remove(database_node.attribute("version"));
}
}

OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
// FileOutputStream暗中同意生成的门路在根路线
XMLWriter xw = new XMLWriter(new FileOutputStream("db2.xml"), format);
xw.write(document);
xw.close();
}

public void read(String fileName) throws Exception {
// sax解析器
SAXReader saxReader = new SAXReader();
// 读到对象
Document document = saxReader.read(this.getClass().getResourceAsStream(
"/" + fileName));
Element root = document.getRootElement();
System.out.println("根节点:" + root.getName());

// List<Element> childElements=root.elements();
List<Element> childElements = root.elements("database");
for (Element child : childElements) {
// 获取属性 不知情属性名称时的遍历方法
List<Attribute> attributes = child.attributes();
// for (Attribute attribute : attributes) {
// System.out.println(attribute.getName()+":"+attribute.getValue());
// }
String name = child.attributeValue("name");
// String version = child.attributeValue("version");
String version = child.attribute("version").getValue();
System.out.println(name + ":" + version);

// //获取子节点
// List<Element> childs=child.elements();
// for (Element element : childs) {
// System.out.println(element.getName()+":"+element.getText());
// }
System.out.println(child.elementText("driver"));
System.out.println(child.element("url").getText());
System.out.println(child.elementTextTrim("user"));
System.out.println(child.element("password").getTextTrim());

}
}

public static void main(String[] args) throws Exception {
// new Dom4jHandler().read("data-source.xml");
// new Dom4jHandler().add();
new Dom4jHandler().update("data-source.xml");
}
}

1、DOM4J简介

接口必得有贯彻类:
interface SuperStar 超大咖
行为标准 :
void sing(int money);
void liveShow(int moeny);
void sleep();

// 接口必须有落到实处类 :

    DOM4J是 dom4j.org 出品的四个开源 XML 深入分析包。DOM4J应用于 Java 平台,接收了 Java 集结框架并完全帮忙 DOM,SAX 和 JAXP。

  1. L implements SuperStar
  2. B implements SuperStar
    Proxy 代理类 :

    DOM4J 使用起来非常轻松。只要你打探基本的 XML-DOM 模型,就会运用。

        Class Proxy 代理类 是在运转时成立的兑现钦定的接口列表(称为代理接口)的类 。 代理实例是代理类的三个实例。 每种代理实例都有二个提到的调用场理程序对象,它完结接口InvocationHandler 。 通过其代理接口之生机勃勃的代理实例上的不二秘技调用将被分派到实例调用项理程序的invoke方法

    Dom:把方方面面文书档案作为贰个对象。

        static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h卡塔尔国重回钦定接口的代办实例,该代理实例将艺术调用分派给钦定的调用项理程序。 

  DOM4J 最大的性状是使用多量的接口。它的显要接口都在org.dom4j中间定义:

15.1.2 动态代理效用:   
         拦截和调控 被代理对象 的全数行为
15.1.3 InvocationHandler 调用项理器
        Interface InvocationHandler 每一种代理实例都有多少个事关的调用途理程序。 当在代理实例上调用方法时,方法调用将被编码并分派到其调用途理程序的invoke方法。

Attribute

定义了 XML 的属性。

Branch

指能够包含子节点的节点。如XML元素(Element)和文档(Docuemnts)定义了一个公共的行为

CDATA

定义了 XML CDATA 区域

CharacterData

是一个标识接口,标识基于字符的节点。如CDATA,Comment, Text.

Comment

定义了 XML 注释的行为

Document

定义了XML 文档

DocumentType

定义 XML DOCTYPE 声明

Element

定义XML 元素

ElementHandler

定义了Element 对象的处理器

ElementPath

被 ElementHandler 使用,用于取得当前正在处理的路径层次信息

Entity

定义 XML entity

Node

为dom4j中所有的XML节点定义了多态行为

NodeFilter

定义了在dom4j 节点中产生的一个滤镜或谓词的行为(predicate)

ProcessingInstruction

定义 XML 处理指令

Text

定义 XML 文本节点

Visitor

用于实现 Visitor模式

XPath

在分析一个字符串后会提供一个 XPath 表达式

          15.1.4 案例

接口之间的接轨关系如下:

15.2  XML
简单介绍 : XML全称为Extensible Markup Language,意思是可扩张的号子语言。

interface java.lang.Cloneable

    标志 -> 用标识来修饰文本新闻.
    
    可扩充 -> 标志可任性定义.

    interface org.dom4j.Node

XML才具 : 与数量有关技术, 在协作社中xml本事常用来囤积数据和传输数据, xml之所以流行的原故在于xml语言与任何编制程序语言非亲非故, xml可用于 php, java, .net任何编程语言.

           interface org.dom4j.Attribute

        15.2.1 书写三个xml配置文件
            xml编写时也要适合自然的规行矩步 :
1)xml文件的后缀名是.xml
2)xml有且独有贰个根标签
3)xml的价签是尖括号包裹关键字成对现身的,有始发标签有收尾标签,关键字是自定义的, xml也能够有空标签/自关闭标签
4)xml允许有总体性,属性也是基于须要自定义的,属个性式:属性= "属性值",多少个属性之间采取空格隔断
5)xml是分别朗朗上口写的
            xml 的组成
1)文书档案注脚:<?xml version="1.0" encoding="UTF-8" ?>

           interface org.dom4j.Branch

2)根标签,例如: <store>

                  interface org.dom4j.Document

3)其余标签,比方:<name>

                  interface org.dom4j.Element

4)属性,例如:category="手提式有线电话机数码"

           interface org.dom4j.CharacterData

5)文本,举例:国产手提式有线电电话机 

                  interface org.dom4j.CDATA

6)注释,例如:<!-- 这是xml文档的根标签 -->

                  interface org.dom4j.Comment

        15.2.2 约束介绍 DTD ,Schema

                  interface org.dom4j.Text

        15.2.3 xml 解析:

           interface org.dom4j.DocumentType

XML的莫过于应用项景 :

           interface org.dom4j.Entity

       实际开辟中,大家经常会选用有滋有味的框架进行公司开采,而那一个框架平时都会将某个公共的作用都早就写好,大家需求做的只要求根据框架提供的封锁进行框架的配备就可以了,当大家选用XML配置好框架后,再运行时,框架底层会深入分析大家配备XML文书档案获取有效的新闻,进而依照大家的需求实现某个意义。

           interface org.dom4j.ProcessingInstruction

故此,实际支出中我们很少会融洽编写XML限制和深入解析XML.

2、XML文书档案操作1

                
 @Test
   public void test1() throws DocumentException {

       // 1. 创办多个 saxReader 分析器
       SAXReader saxReader = new SAXReader();
       // 2. 调用 read 方法读取 xml 配置文件, 并获取二个 document 对象
       Document document = saxReader.read("books.xml");
       // 3. 调用 getRootElement 方法, 获取根标签对象
       Element root = document.getRootElement();
       // 4. 调用 elements 方法, 获取子标签数组
       List<Element> bookElements = root.elements();
       // 5. 遍历 bookElements 数组
       for (Element book : bookElements) {
           // 6. 调用 attributeValue 方法, 传入属性名称, 获取相应的属性值
           String author = book.attributeValue("author");
           System.out.println("author = " + author);

           // 7. 获取子标签
           List<Element> elements = book.elements();
           // 8. 遍历子标签
           for (Element e : elements) {
               // 9. 到手标签字称, 和标签体数据
               String name = e.getName();
               String text = e.getText();
               System.out.println(name + " = " + text);
          }
      }
  }

出口结果 :
author = 张三丰
name = Java从入门到精通
price = 98
author = 灭亡师太
name = Java编制程序观念
price = 998
   @Test
   public void test2() throws DocumentException {
       // 1. 创办三个 saxReader 剖析器
       SAXReader saxReader = new SAXReader();
       // 2. 调用 read 方法读取 xml 配置文件, 并获取一个 document 对象
       Document document = saxReader.read("beans.xml");
       // 3. 调用 getRootElement 方法, 获取根标签对象
       Element root = document.getRootElement();
       // 4. 调用 elements 方法, 获取子标签数组
       List<Element> beanElements = root.elements();
       // 5. 调用 elements 方法, 获取子标签数组
       for (Element bean : beanElements) {
           // 6. 调用 attributeValue 方法, 传入属性名称, 获取相应的属性值
           String id = bean.attributeValue("id");
           String className = bean.attributeValue("className");
           System.out.println(id + " = " + className);
           // 7. 调用 elements 方法, 获取子标签数组
           List<Element> propElements = bean.elements();
           // 8. 调用 propElements 方法, 获取子标签数组
           for (Element prop : propElements) {
               // 9. 调用 attributeValue 方法, 传入属性名称, 获取相应的属性值
               String name = prop.attributeValue("name");
               String value = prop.attributeValue("value");
               System.out.println(name + " = " + value);
          }
      }
  }

输出结果 :
001 = cn.itcast.bean.User
username = ZhangSan
password = 123456
002 = cn.itcast.bean.User
username = LiSi
password = 654321

2.1、读取XML文档:

15.3  正则表达式

     读写XML文档首要依附于org.dom4j.io包,有DOMReader和SAXReader二种艺术。因为使用了长期以来的接口,它们的调用格局是均等的。

        15.3.1 正则概念
            egular Expression 正则表明式 : 在Java中, 正则首要使用在 String 类的秘诀参数为 regex 的名目上
            
 String 类的五个带 regex 参数的艺术 :
split(String regex) 切割.
matches(String regex) 匹配.
replaceAll(String regex, String replacement) 替换.

public static Document load(String filename) {

        15.3.2 符号介绍

Document document = null;

  1. [] 取值的范围. 0-9 数值0到9都创建.
            说明 : [0-9] 能够行使 \d 表示
  2. {} 表示前一个尺码中 `值 / 字符` 能够现身的次数.
     说明 : {4,11} 至少4次, 最多11次.
        {0,1} 起码0次,最多二遍. 能够行使 ? 表示.
        {1,} 起码1次,最多Infiniti次 能够应用 + 表示.
        {0,} 最少0次,最多Infiniti次. 能够运用 * 表示.
  3. (卡塔尔国 表示分组. 在replaceAll方法的第三个参数上能够应用 $ 符号来引用早前的分组,分组编号自动从1早先.

try {

         15.3.3 案例
                    
public class ReplaceAllTest4 {
   public static void main(String[] args) {

       // 13311111946 -> 133****1946

       String phone = "13311111946";

       /*
          源数据 : 13311111946
          第一片段 : 133     法则风流罗曼蒂克 : 1[34578]\d
          第二有的 : 1111     法规二 : \d{4}
          第三某个 : 1949     准绳三 : \d{4}
        */

       String result = phone.replaceAll("(1[34578]\d)(\d{4})(\d{4})", "$1****$3");
       System.out.println("result = " + result);
  }
}

输出结果 :
result = 133****1946

SAXReader saxReader = new SAXReader();

document = saxReader.read(new File(filename));  //读取XML文件,获得document对象

} catch (Exception ex) {

ex.printStackTrace();

}

return document;

}   

public static Document load(URL url) {

Document document = null;

try {

SAXReader saxReader = new SAXReader();

document = saxReader.read(url);  //读取XML文件,获得document对象

} catch (Exception ex) {

ex.printStackTrace();

}

return document;

}

//读取内定的xml文件之后回来三个Document对象,这一个指标表示了全套XML文书档案,用于种种Dom运算。许可证XML文件头所定义的编码来转变。

2.2、获取根节点

根节点是xml剖析的以前,任何xml解析职业都亟待从根最初

Xml xml = new Xml();

Document dom = xml.load(path + "/" + file);

Element root = dom.getRootElement();

2.3、. 新添二个节点以至其下的子节点与数码

Element menuElement = root.addElement("menu");

Element engNameElement = menuElement.addElement("engName");

engNameElement.setText(catNameEn);

Element chiNameElement = menuElement.addElement("chiName");

chiNameElement.setText(catName);

2.4、 写入XML文件

介意文件操作的卷入类是乱码的源于

public static boolean doc2XmlFile(Document document, String filename) {

boolean flag = true;

try {

XMLWriter writer = new XMLWriter( new OutputStreamWriter(new FileOutputStream(filename),"UTF-8"));

writer.write(document);

writer.close();

} catch (Exception ex) {

flag = false;

ex.printStackTrace();

}

System.out.println(flag);

return flag;

}

 

    Dom4j经过XMLWriter将Document对象表示的XML树写入钦点的文本,并利用OutputFormat格式对象内定写入的作风和编码方法。调用OutputFormat.createPrettyPrint(卡塔尔方法能够赢得叁个私下认可的pretty print风格的格式对象。对OutputFormat对象调用setEncoding(卡塔尔方法可以钦点XML文件的编码方法。

 

public void writeTo(OutputStream out, String encoding) throws UnsupportedEncodingException, IOException {

       OutputFormat format = OutputFormat.createPrettyPrint();

       format.setEncoding("gb2312");

       XMLWriter writer = new XMLWriter(System.out,format);

       writer.write(doc);

       writer.flush();

       return;

}

2. 5、遍历xml节点

       对Document对象调用getRootElement(卡塔尔(英语:State of Qatar)方法能够重临代表根节点的Element对象。具有了三个Element对象后,能够对该对象调用elementIterator(卡塔尔(قطر‎方法得到它的子节点的Element对象们的一个迭代器。使用(Element卡塔尔(英语:State of Qatar)iterator.next(卡塔尔(قطر‎方法遍历叁个iterator并把各样抽取的元素转变为Element类型。

public boolean isOnly(String catNameEn,HttpServletRequest request,String xml) {

boolean flag = true;

String path = request.getRealPath("");

Document doc = load(path+"/"+xml);

Element root = doc.getRootElement();

for (Iterator i = root.elementIterator(); i.hasNext();) {

Element el = (Element) i.next();

if(catNameEn.equals(el.elementTextTrim("engName"))){

flag = false;

break;

}

}

return flag;

}

2.6、创建xml文件

public static void main(String args[]){

本文由澳门网络娱乐游戏平台发布于编程,转载请注明出处:澳门官方赌搏网站java解析xml的三种方法

相关阅读