XML

XML

XML可扩展标记语言,没有固定的标签,所有标签都可以自定义
xml被用于信息的记录和传递,经常被当作配置文件

(1)声明信息

描述xml的版本信息和编码方式

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

(2)DTD

DTD:文档类型定义
DTD用于约束xml的文档格式,DTD分为两种,内部DTD,外部DTD

1.内部DTD

1.声明根元素
xml有且只有一个根元素

<!DOCTYPE 根元素 [元素声明]>

2.元素声明

<!ELEMENT 元素名 (子元素[, 子元素...])>

数量词:
+:出现一次或多次
?:出现一次或0次
*:出现任意次

3.属性声明

<!ATTLIST 元素名称 属性名称 属性类型 默认值>

属性类型:
CDTA,表示字符数据

#REQUIRED:表示这个属性是必需的
#IMPLED:表示这个属性不是必需的

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE players [
        <!ELEMENT players (player)+>
        <!ELEMENT player (name,height,score)>
        <!ATTLIST player id CDATA #REQUIRED>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT height (#PCDATA)>
        <!ELEMENT score (#PCDATA)>
        ]>
<players>
    <player id="1">
        <name>欧文</name>
        <height>190</height>
        <score>50</score>
    </player>
    <player id="2">
        <name>库里</name>
        <height>191</height>
        <score>35</score>
    </player>
</players>

2.外部DTD
xml中引入外部DTD文件

players.dtd

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT players (player)+>
<!ELEMENT player (name,height,score)>
<!ATTLIST player id CDATA #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT height (#PCDATA)>
<!ELEMENT score (#PCDATA)>

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE players SYSTEM "players.dtd">
<players>
    <player id="1">
        <name>欧文</name>
        <height>190</height>
        <score>50</score>
    </player>
    <player id="2">
        <name>库里</name>
        <height>191</height>
        <score>35</score>
    </player>
</players>

解析xml

1.DOM解析
基于xml树解析
2.SAX解析
基于事件的解析

3.JDOM解析
第三方提供,开源免费的解析方式,比DOM解析快
4.DOM4J
第三方提供,开源免费,是JDOM的升级版

SAX解析

SAX解析
1.获取解析工厂
SAXParserFactory factory=SAXParserFactory.newInstance();
2.从解析工厂获取解析器
SAXParser parse=factory.newSAXParser();
3.加载文档Docunment注册处理器
4.编写处理器
PersonHandler handler=new PersonHandler ();
parse.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream(“person.xml”),handler);

1.SAX解析获取数据

<?xml version="1.0" encoding="UTF-8" ?>
<persons>
    <person>
        <name>欧文</name>
        <height>188</height>
    </person>
    <person>
        <name>乔丹</name>
        <height>198</height>
    </person>
</persons>
import org.xml.sax.Attributes;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.IOException;

public class XmlTest {
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        //SAX解析
        //1.获取解析工厂
        SAXParserFactory factory=SAXParserFactory.newInstance();
        //2从解析工厂中获取解析器
        SAXParser parser=factory.newSAXParser();
        //3编写处理器  继承DefaultHandler

        //4.加载文档Document注册处理器
        PersonHandler handler=new PersonHandler();
        //5.解析器解析
        parser.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("person.xml"),handler);

    }
}

class PersonHandler extends DefaultHandler{   //处理器
    @Override
    public void startDocument() throws SAXException {
        System.out.println("-----解析文档开始----");
    }
    
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        System.out.println(qName+" 解析");
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        String contents=new String(ch,start,length).trim();
        if(contents.length()>0){
            System.out.println("内容为:"+contents);
        }else{
            System.out.println("内容为空");
        }

    }
    
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        System.out.println(qName+"  解析结束");
    }

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

DOM4J解析xml

需导入dom4j的jar包

读取xml

其内部有DOMReader和SAXReader两种

解析流程
1.创建SAXReader对象,读取xml文件
2.获得Document对象
3.获取根元素
4.获取根元素下的所有元素


import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.Iterator;

public class Test {
    public static void main(String[] args) throws Exception {
        //1.获取SAXReader
        SAXReader reader=new SAXReader();
        //2.获取Document对象
        Document document=reader.read(new File("src/player.xml"));
        //3获取根元素
        Element root=document.getRootElement();
        //遍历根元素下的子元素
        Iterator<?> it=root.elementIterator();
        while (it.hasNext()){
            Element e= (Element) it.next();
            System.out.println(e.getName());
            Attribute id=e.attribute("id");          //获得属性
            System.out.println(id.getName()+":"+id.getValue());
            Element name=e.element("name");         
            System.out.println(name.getName()+":"+name.getText());
            Element height=e.element("height");
            System.out.println(height.getName()+":"+height.getText());
            Element score=e.element("score");
            System.out.println(score.getName()+":"+score.getText());
            System.out.println();
        }
    }
}


输出结果:
player
id:1
name:欧文
height:190
score:50

player
id:2
name:库里
height:191
score:35

创建xml文件

创建流程
1.通过DocumentHelper创建一个Document对象
2.添加根元素
3.根元素添加子元素
4.再添加子元素或属性
5.添加文本
6.输出到xml文件中,可使用美化输出


import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class Test2 {
    public static void main(String[] args) throws IOException {
        //1通过DocumentHelper获取Document对象
        Document document=DocumentHelper.createDocument();
        //2创建根元素
        Element root=document.addElement("players");
        //3创建根元素的子元素
        Element player=root.addElement("player");
       //4子元素添加属性
        player.addAttribute("id","1");
        Element name=player.addElement("name");
        name.addText("欧文");    //添加文本
        Element height=player.addElement("height");
        height.addText("190");
        Element score=player.addElement("score");
        score.addText("50");

        Writer writer = new FileWriter(new File("src/player.xml"));
        document.write(writer);
        writer.close();
		
		
    }
}

不使用美化
在这里插入图片描述
可读性不强,不美观

所以使用OutputFormat来美化

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class Test2 {
    public static void main(String[] args) throws IOException {
        //1通过DocumentHelper获取Document对象
        Document document=DocumentHelper.createDocument();
        //2创建根元素
        Element root=document.addElement("players");
        //3创建根元素的子元素
        Element player=root.addElement("player");
       //4子元素添加属性
        player.addAttribute("id","1");
        Element name=player.addElement("name");
        name.addText("欧文");    //添加文本
        Element height=player.addElement("height");
        height.addText("190");
        Element score=player.addElement("score");
        score.addText("50");


        OutputFormat format=OutputFormat.createPrettyPrint();
        XMLWriter writer=new XMLWriter(new FileWriter("src/players.xml"),format);
        writer.write(document);
        writer.close();
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值