XML的概述

xml是指可扩展标记语言(extensible Markup Language),它是一种标记语言,很类似HTML。它被设计的宗旨描述数据,而非显示数据
xml标签没有被预定义,需要用户自行定义标签
xml被广泛认为是继java之后在Internet上最激动人心的新技术。
XML文档的组成
一个xml文件一般由以下几个部分组成:
1.文档声明
2.元素
3.元素属性
4.注释
5.CDATA
6.特殊字符
文档声明:
(1)在编写xml文档时,需要先使用文档声明来声明xml文档。且必须出现在文档的第一行。
(2)最简单的语法<?xml version=“1.0”>
(3)用encodinng属性说明文档所使用的字符编码,默认使用UTF-8.保存在磁盘上的文件编码要与声明的编码一致。
如:<? xml version="1.0" encoding="GB2312"?>
(4)用standalone属性说明文档是否独立,即是否依赖其他文档。
如:<? xml version="1.0" standalone="yes" ?>
元素:
(1)xml元素指xml文件中出现的标签。一个标签分为开始和结束标签(不能省略)。一个标签有如下几种书写形式:
1.包含标签体
2.不包含标签体
3.一个标签中可以嵌套若干子标签,但所有标签必须合理的嵌套,不允许有交叉嵌套。
(2)一个xml文档必须有且仅有一个根标签,其他标签都是这个根标签的子标签或孙标签
(3)元素(标签)的名称可以包含字母、数字、减号、下划线和英文句点,但必须遵守下面的一些规范
1.严格区分大小写
2.只能以字母或下划线开头:abc_abc
3.不能以xml(或XML。Xml)开头—W3C保留日后使用:
4.名称字符之间不能有空格或制表符;
5.名称字符之间不能使用冒号:(有特殊作用)
(4)元素的属性
1.一个元素可以有多个属性,每个属性都有它自己的名称和取值
2.属性值一定要用引号(单引号或双引号)引起来。
3.属性名称的命名规范与元素的命名规范相同
4.元素中的属性是不允许重复的
5.在xml技术中,标签属性所代表的信息也可以被改成用子元素的形式来描述。
注释:
(1)XML中的注释语法为:注意:<!- -这是注释- ->
1.xml声明之前不能有注释
2.注释不能嵌套
CDATA区
(1)CDATA是Character Data缩写
(2)作用:把标签当做普通文本内容:
语法:<![CDATA[[内容]]>

<![CDATA[ www.csdn.net ]]>

特殊字符:
< < 小于
> > 大于
& & 和号
’ ’ 单引号
" " 双引号
为什么需要约束?
1.XML都是用户自定义的标签,若出现小小的错误,软件程序将不能正确地获取文件中的内容而报错。(如:Tomcat)
2.XML技术中,可以编写一个文档来约束一个XML的书写规范,这个文档称之为约束。
两个概念:
(1)格式良好的XML:遵循XML语法的XML
(2)有效的XML:遵循约束文档的XML
3.总之:约束文档定义了在XML中允许出现的标签名称、属性及标签出现的顺序等等。
XML Schema
1.XML Schema也是一种用于定义和描述XML文档结构与内容的模式语言,其出现是为了克服DTD的局限性
2.XML Schema VS DTD
(1)XML Schema符合XML语法结构
(2)DOM、SAX等XML API很容易解析出XML Schema文档中的内容
(3)XML Schema对名称空间支持得非常好
(4)XML Schema比XML DTD支持更多的数据类型,并且支持用户自定义新的数据类型
(5)XML Schema定义约束的能力非常强大,可以对XML实例文档作出明细的语义限制
Schema约束
(1)XML Schema文档自身就是一个XML文件,但它的扩展名通常为.xsd.
(2)一个XML Schema文档通常称之为模式文档(约束文档),遵循这个文档书写的XML文件称之为实例文档
(3)和XML文件一样,一个XML Schema文档也必须有一个根节点,但这个根节点的名称为Schema
(4)编写一个XML Schema约束文档后,通常需要把这个文件中声明的元素绑定到一个URL的地址上,在SML Schema技术中有一个专业术语来描述这个过程,即把XML Schema文档声明的元素绑定到一个名称空间上,以后XML文件就可以通过这个URL(即名称空间)来告诉解析引擎,xml文档中编写的元素来自哪里,被谁约束。
java解析XML概述
1.XML解析方式分为两种:DOM方式和SAX方式
(1)DOM:Document Object Model,文档对象模型。这种方式是W3C推荐的处理XML的一种方式。
(2)SAX:Simple API XML。这种方式不是官方标准,属于开源社区XML-DEV,几乎所有的XML解析器都支持它。
2.XML解析开发包
1.JAXP:是SUN公司推出的解析标准实现。
2.Dom4J:是开源组织推出的解析开发包。
Dom4J的常用方法:
Document:
Element getRootElement():获取根元素对象(根标签)
Element:
List elements():获取所有的子元素
List elements(String name):根据指定的元素名称来获取相应的所有子元素
Element element(String name):根据指定的元素名称来获取子元素对象,如果元素重复,则获取第一个元素
String elementText(String name):根据指定的元素名称,来获取子元素中的文本 String getText():获取当前元素对象的文本
oid SetText(String text):设置当前元素的文本
String attributeValue(String name):根据指定的属性名称获取其对应的值
public Element addAttribute(String name,String vale):根据指定的属性名称和值进行添加或者修改
Dom4j案例
xml文件

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

<State Code="37" Name="河北" description="邯郸" GDP="8880"> 
  <City> 
    <name>河北</name>  
    <Region>邯郸</Region> 
  </City>  
  <City>石家庄</City>  
  <City>张家口</City>  
  <City>邢台</City>  
  <City>廊坊</City>  
  <City>衡水</City> 
</State>

Dom4JUtils工具类:

public class Dom4JUtils {
	private Dom4JUtils() {
	}

	public static Document getDocument() throws DocumentException {
		SAXReader reader = new SAXReader();
		Document read = reader.read("src/com/itheima16/city.xml");
		return read;
	}
	public static void  write2XML(Document document) throws IOException{
		OutputFormat format=OutputFormat.createPrettyPrint();
		//format.setEncoding("UTF-8");//默认的编码就是UTF-8
		XMLWriter writer=new XMLWriter(new FileOutputStream("src/com/itheima16/city.xml"), format);
		writer.write(document);
	}

}

Dom4J案例的增删改查

public class Demo4JDemo {
	public static void main(String[] args) throws Exception {
		//method01();
		//method02();
		//method03();
		//method04();
		//method05();
		//method06();
		//method07();
		//7.添加:State:GDP="8880亿"
		Document document = Dom4JUtils.getDocument();
		Element rootElement = document.getRootElement();
		rootElement.addAttribute("GDP", "8880");
		//写回文件
		Dom4JUtils.write2XML(document);
		
	}
	private static void method07() throws DocumentException {
		//6.操作XML文件属性:打印State的name
		Document document = Dom4JUtils.getDocument();
		//获取根元素
		Element rootElement = document.getRootElement();
		//根据属性名称获取值
		String attributeValue = rootElement.attributeValue("Name");
		System.out.println(attributeValue);
	}
	private static void method06() throws DocumentException, IOException {
		//5.向指定元素节点上增加同级元素节点:在刑台前面,添加一个<City>张家口</City>
		//创建一个新的元素对象
		Element createElement = DocumentHelper.createElement("City");
		createElement.setText("张家口");
		//获取根元素
		Document document = Dom4JUtils.getDocument();
		//获取根元素下所有的子元素
		Element rootElement = document.getRootElement();
		//将新的元素添加到子元素列表中
		List<Element> elements = rootElement.elements();
		elements.add(2,createElement);
		//写回文件
		Dom4JUtils.write2XML(document);
	}
	private static void method05() throws DocumentException, IOException {
		//5.向指定元素节点中增加子元素节点:添加一个城市<City>衡水</City>
		Document document = Dom4JUtils.getDocument();
		//获取根元素
		Element rootElement = document.getRootElement();
		//添加元素
		Element addElement = rootElement.addElement("City");
		//设置文本
		addElement.setText("衡水");
		//写回文件
		Dom4JUtils.write2XML(document);
	}
	private static void method04() throws DocumentException, IOException {
		//4.删除指定元素节点:删除元素邢台
	     Document document = Dom4JUtils.getDocument();
	     //获取根元素
	     Element rootElement = document.getRootElement();
	     //获取根元素下的所有子元素
	     List<Element> elements = rootElement.elements();
		Element element = elements.get(2);
		//获取父元素
		Element parent = element.getParent();
		parent.remove(element);
		//写回文件
		Dom4JUtils.write2XML(document);
	}
	private static void method03() throws DocumentException, IOException {
		//3.修改某个元素节点的主体内容:保定--->廊坊
		Document document = Dom4JUtils.getDocument();
		//获取根元素
		Element rootElement = document.getRootElement();
		//获取根元素下的所有子元素
		List<Element> elements = rootElement.elements();
		//根据索引可以获取指定的元素
		Element element = elements.get(3);
		//修改文本
		element.setText("廊坊");
		//写回文本
		Dom4JUtils.write2XML(document);
	}
	private static void method02() throws DocumentException {
		//2.遍历所有元素节点:打印他们的元素名称
		Document document = Dom4JUtils.getDocument();
		Element rootElement = document.getRootElement();
		treeWalk(rootElement);
	}
	//递归
	public static void treeWalk(Element element){
		//输出元素的名称
		System.out.println(element.getName());
		//获取指定元素的所有子元素
		List<Element> elements = element.elements();
		for (Element element2 : elements) {
			treeWalk(element2);
		}
	}

	private static void method01() throws DocumentException {
		//1.得到某个具体的节点内容:打印“郑州”
		Document document = Dom4JUtils.getDocument();
		//获取根元素
		Element rootElement = document.getRootElement();
		//获取根元素下的所有子元素
		List<Element> elements = rootElement.elements();
	   //根据索引获取第一个City元素
		Element cityElement = elements.get(0);
		//根据子元素的名称来获取子元素的文本
		String elementText = cityElement.elementText("name");
		System.out.println(elementText);
	}

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值