XML系列快速巩固

JavaSE 专栏收录该内容
30 篇文章 0 订阅

XML系列包含什么

本文XML系列包含XML,DTD/Schema,Jaxp/Dom4j,dom/sax。

XML是什么?
XML是一种可扩展标记语言,一篇完整的XML会使用到文档声明,标签,属性 ,特殊字符,CDATA区以及注释。

DTD,Schema是什么?
DTD,Schema是XML的约束文档,对XML的内容进行约束。

Jaxp,Dom4j是什么?
Jaxp,Dom4j是XML的常用解析器,Java通过使用解析器能使用XML文档。

dom,sax是什么?
dom,sax是XML的两种解析技术,解析器实现了这些技术。

XML,DTD/Schema需要注意:每两个单词后面都要加一个空格

XML

关于标签,属性的书写规范:

  1. 区分大小写
  2. 数字不能开头,不能包含空格和冒号
  3. 不能使用xml这个单词及大写形式

XML的符号通通需要使用转义字符表示,通常为了不记忆琐碎的转义字符,可以使用CDATA区,CDATA区中所有字符可正常显式。

//CDATA区格式
<![CDATA[<标签>...<标签>]]>       

完整的XML,看懂这个就会了。

//文档声明,version该xml遵循的jishu版本,encoding该xml的编码格式
<?xml version="1.0" encoding="UTF-8"?>
<person>  
  <p> 
    <name>jiwenlong</name>   
    <age>21</age> 
  </p>  
  <p> 
    <name>guoxinlei</name>  
    <age>21</age> 
  </p>  
  <p> 
    <name>popo</name>  
    <age>23</age> 
  </p> 
</person>

XML约束—DTD

完整DTD文档,看这个实例。

//标签限制,<! ElEMENT...>是标准格式,类似TVSCHEDULE是标签名
// (#PCDATA)表示该标签是简单标签,简单标签里面是值
//(BANNET,DAY+)表示该标签是复杂标签,他有一个BANNET标签,多个DAY标签。
<!ELEMENT TVSCHEDULE (CHANNE+)>
<!ELEMENT CHANNE (BANNER)>
<!ELEMENT BANNER (#PCDATA)>
//标签的属性限制,<!ATTLIST>是标准格式
//类似NAME是属性名
//#IMPLIED 表示这个属性可有可无,#REQUIRED 表示这个属性必须有
<!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED>
<!ATTLIST CHANNE CHAN CDATA #REQUIRED>

那么如何使用DTD约束XML,看这个实例

//比没有约束的xml多了一行,TVSCHEDULE是根节点标签,SYSTEM " "中是DTD约束文件的地址
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE TVSCHEDULE SYSTEM "src/Xml/DTD.dtd">
<TVSCHEDULE NAME="JI">
	<CHANNE CHAN="JI">
		<BANNER>JIWENLONG</BANNER>	
	</CHANNE>
</TVSCHEDULE>

XML约束—Schema

完整的Schema,看这个实例

/*
 *xmlns="http://www.w3.org/2001/XMLSchema",targetNamespace="http://www.example.org/FirstSchema" ,elementFormDefault="qualified"是雷打不动,照着抄就对了,eclipse会自动生成
 **/
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://www.example.org/FirstSchema" 
elementFormDefault="qualified">

<element name="person">       //表示头标签是person
	<complexType>             //格式要求
		<sequence>            //可以用all,choice,any代替
			<element name="p"></element>
			<element name="p"></element>
		</sequence>
	</complexType>
</element>
<!--  <all> 不仅限制xml,还限制schema,相同元素只能出现一次 -->
<!-- maxOccurs = "unbounded"  元素可以出现任意次数,写在标签内-->
<element name="p">
	<complexType>
		<sequence>
			<element name="name" type="string"></element>
			<element name="age" type="int"></element>
		</sequence>
	</complexType>
</element>
<!-- <Choice>限制元素只能出现一个 -->
<!-- <any>可写任意元素 -->
</schema>

那么如何用Schema约束XML,看这个实例

//xmlns填写对应的Schema的命名空间targetNamespace后面的字符串
//xmlns:xsi,是对xmlns起的别名,填写对应schema的xmlns后加上-instance,表示这个xml是被约束方
//xsi:schemaLocation里有两个字符串,前一个和xmlns一样,后一个填schema文件的地址
<?xml version="1.0" encoding="UTF-8"?>
<person xmlns="http://www.example.org/FirstSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/FirstSchema FirstSchema.xsd">  
  <p> 
    <name>jiwenlong</name>   
    <age>21</age> 
  </p>  
  <p> 
    <name>guoxinlei</name>  
    <age>21</age> 
  </p>  
  <p> 
    <name>popo</name>  
    <age>23</age> 
  </p> 
</person>

解析器Jaxp

sax缺点增删改困难,优势在于处理对大文件没内存压力;dom优点和缺点与sax相反。

Jaxp下的sax技术

package Xml;

/*
 * sax解析:边读边解析,不能增删,可配合判断语句查询,
 * SAXParserFactory是解析器工厂,通过静态方法创对象
 * SAXParser是解析器,通过静态方法创对象
 * saxparer.parse("src/thread.xml",new Mydefault()) 中前一个参数是xml文档的地址,后一个是驱动事件
 * parse方法通过Mydefault对象对文档解析
 * */
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;;

public class JaxpSax {
	public static void main(String[] args) throws Exception {
		SAXParserFactory factory = SAXParserFactory.newInstance();
		SAXParser saxparer = factory.newSAXParser();
		saxparer.parse("src/thread.xml",new Mydefault());
	}
}

class Mydefault extends DefaultHandler{
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		super.startElement(uri, localName, qName, attributes);
		System.out.print("<"+qName+">");
	}

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

	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		// TODO Auto-generated method stub
		super.endElement(uri, localName, qName);
		System.out.print("</"+qName+">");
	}

}

Jaxp下的dom技术

package Xml;

/*
 *最重要的是理记牢解析器的创建使用,和回写 
 * **/
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.Text;

public class JaxpDom {
	public static void main(String[] args) throws Exception {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document = builder.parse("src/Xml/SchemaXml.xml");
		Node node = document.getElementsByTagName("p").item(0);
		Element school = document.createElement("school");
		Text Text = document.createTextNode("aliyun");
		school.appendChild(Text);
		node.appendChild(school);
		TransformerFactory tran = TransformerFactory.newInstance();
		Transformer transformer = tran.newTransformer();
		transformer.transform(new DOMSource(document), new StreamResult("src/Xml/SchemaXml.xml"));
	}
}

解析器Dom4j

需要导入Dom4j包
Dom4j的更新操作

package Dom4j;
/*
 * Elemen是接口,是Node的子类
 * Dom4j的添加操作
 * add1():addElement(qname)方法将qname顺序添加在当前元素的子标签下
 * add2():通过DocumentHelper.createElement(qname)操作新建一个标签qname,list.add( ,)在指定位置添加标签
 * Dom4j的修改操作
 * 可以直接通过setText()修改
 * DOm4j的删除操作
 * 通过父节点remove()
 * **/
import java.io.FileOutputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class AddDom4j {
	public static void main(String[] args) throws Exception {
		add2();
	}
	
	public static void add1() throws Exception {
		SAXReader saxreader = new SAXReader();
		Document document = saxreader.read("src/Xml/SchemaXml.xml");
		Element root = document.getRootElement();
		Element cite = root.addElement("p");
		Element name = cite.addElement("name");
		name.setText("popo");
		Element age = cite.addElement("age");
		age.setText("23");
		age.setText("34");
		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter xmlwriter = new XMLWriter(new FileOutputStream("src/xml/SchemaXml.xml"),format);
		xmlwriter.write(document);
		xmlwriter.close();
	}
	
	public static void add2() throws Exception {
		Document document = FunctionDom4j.Document(FunctionDom4j.PATH);
		Element root = document.getRootElement();
		Element p = root.element("p");
		List<Element> list = p.elements();
		Element school = DocumentHelper.createElement("school");
		school.setText("阿里云");
		list.add(1, school);
		FunctionDom4j.XMLWriter(document,FunctionDom4j.PATH);
	}
}

Dom4j的查询操作

/*
 * dom4j查询
 * element(qname)查询当前标签下第一个叫qname的标签
 * elements(qname)查询当前标签下所有叫qname的标签(一层子标签)
 * elements()查询当前标签下所有的标签(一层子标签)
 * **/
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class SelectDom4j {
	public static void main(String[] args) throws Exception {
		Select();
	}
	public static void Select() throws Exception {
		//解析器
		SAXReader saxreader = new SAXReader();
		//文档
		Document document = saxreader.read("src/Xml/SchemaXml.xml");
		//根节点
		Element root = document.getRootElement();
		
		List<Element> list = root.elements("p");
		Iterator<Element> iterator = list.iterator();
		while(iterator.hasNext()) {
			String str = iterator.next().element("name").getText();
			System.out.println(str);
		}
	}
}

Dom4j对XPATH的支持

需要导入对XPATH支持的特定包
XPATH中查询规则:

  • //name 表示查询所有name标签
  • //name[@ id = ’ 1’] 表示查询属性值id等于1 的所有name标签
  • /person/name 表示查询person标签下的name标签 ,/表示层
  • /* 表示所有元素
package Dom4j;

import java.util.*;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.dom4j.util.NodeComparator;

public class XPATHDom4j {
	public static void main(String[] args) throws Exception {
		selectSingle();
	}
	public static void selectSingle() throws Exception {
		//获取document
		SAXReader saxreader = new SAXReader();
		Document document = saxreader.read("src/Xml/DTDXml.xml");
		List<Node> list = document.selectNodes("//CHANNE[@CHAN='JI']/BANNER");
		Iterator<Node> iterator = list.iterator();
		while(iterator.hasNext()) {
			Node node = iterator.next();
			String str = node.getText();
			System.out.println(str);
		}
	}
}

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:像素格子 设计师:CSDN官方博客 返回首页

打赏作者

1024工程师

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值