XML可扩展标记语言

一、XML可扩展标记语言

1、概念:

XML推出初衷是为了替换HTML,标签名可以直接定义,不能用数字开头 不能使用纯数字 区分大小写,后用做配置文件 封装数据

因为xml具有良好的格式,所以用途非常广泛,比如持久化存储数据 数据交换 数据配置

xml和html的区别:

1)html的标签是固定的,不能扩展。xml的标签是不固定的,可扩展的。

2)html侧重于显示的信息。xml侧重于标识信息的结构。

3)html是不区分大小写的。xml是区分大小写的。xml的语法比html更严谨。

2、组成部分

文档声明:<?xml version="1.0" encoding="utf-8"?>

必须顶行 顶格写

根标签:有且仅有一个根标签

其他标签:有开始标签 一定要有结束标签

标签属性:一个标签可以有多个属性,每个属性都有它自己的名称和取值,例如:<Student name="text">

注解:<!-- --> //Comment注释对象

标签里的内容 egg张三:<name>张三</name>

XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理

3、解析思想

DOM解析思想:Document Object Model 文档对象模型(dom4j解析)

将文档一次性 加载进内存 然后将文档各个组成部分抽取为对象

优点: 能够对文档进行增删改查

缺点:耗内存 适用于PC端

SAX解析思想:基于事件 逐行解析,一次读取一行,释放一行(sax解析、pull解析)

优点 :不占内存  适用于移动端

缺点:只能查 不能增删改

二、dom4j解析

读取xml文件步骤:

1、导入DOM4J jar包

2、创建解析器对象

SAXReader reader = new SAXReader();

Document doc = reader.read(new FileInputStream("xml文件名.xml"));

3、获取根标签对象

Element rootElement = doc.getRootElement();

1) rootElement.node(第几个节点);//获取单个节点对象

获取根标签下的子节点(不能获取孙子节点),空白地方也算一个子节点对象

rootElement.nodeIterator();//获取多个节点对象

2) rootElement.element("标签名");//获取第一个子标签对象

rootElement.elements();//获取所有的子标签对象

rootElement.elementIterator();//通过迭代器的方式获取所有的子标签对象

4、获取标签属性对象

Element element = rootElement.element("标签名");

Attribute attribute = element.attribute(第几个属性/"属性名");

attribute.getName();//获取属性的键

attribute.getValue();//获取属性的值

//element.attributes();获取所有的属性对象

//element.attributeIterator();通过迭代器的方式获取所有的属性对象

//element.attributeValue(第几个属性/"属性名");直接获取属性对象的值

5、获取标签内文本

List<Element> list = element.elements();

for(Element ele:list){

String text = ele.getText();//获取文本内容

System.out.println(text);

}

用代码写xml文件步骤:

导入DOM4J jar包

//通过文档帮助类create doc
		Document doc = DocumentHelper.createDocument();

		//添加一个根标签
		Element rootEle = doc.addElement("students");
		//添加一个子标签
		Element ele = rootEle.addElement("student");
		//给student标签添加一个属性
		ele.addAttribute("id", "9527");
		//给student添加一个名字和学号标签及内容
		Element element1 = ele.addElement("sname");
		element1.addText("张三");
		Element element2 = ele.addElement("sid");
		element2.addText("007");

		//把内存中doc 写到硬盘上
		OutputFormat format1 = OutputFormat.createCompactFormat();
		OutputFormat format2 = OutputFormat.createPrettyPrint(); //漂亮的格式
		// 在开发阶段 利于我们调试 可以使用漂亮的格式
		// 项目开发好之后上线,我们要调整成紧凑格式 减小xml文件的体积
		XMLWriter writer = new XMLWriter(new FileOutputStream("mydoc.xml"), format2);
		writer.write(doc);
		writer.close();

用代码修改xml文件步骤:

//找到你想修改的节点

1)修改属性的值

attribute.setValue("新属性值");

2)修改文本

element.setText("新文本");

3)删除标签、属性

element.detach();

attribute.detach();

// 重新写入到硬盘覆盖掉原文件

XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("xml文件名.xml"));

xmlWriter.write(doc);

xmlWriter.close();

附:XPath:主要是用于xml快速获取所需的节点对象

1、导入Dom4j 的jar包 和支持xPath技术的jar包

2、使用xpath方法:

List<Node> list = rootElement.selectNodes("xpath表达式");   查询多个节点对象

Node nade = rootElement.selectSingleNode("xpath表达式");  查询一个节点对象

3、xpath表达式

/      绝对路径     选择该标签下子标签

//     相对路径     该标签下所有标签,表示不分任何层次结构的选择元素。

*      通配符       表示匹配所有元素

[]      条件        表示选择什么条件下的元素

@       属性        表示选择属性节点,定位一个属性名

and     关系        表示条件的与关系(等价于&&)

not()   取反

text()  文本        表示选择文本内容

egg:String path = "//user[@id='2']/name"; //选出所有user标签中id="2"的user标签下的name标签

三、sax解析

sax解析有两个部分,解析器和事件处理器

解析器就是XMLReader接口,负责读取XML文档,和向事件处理器发送事件(也是事件源)

事件处理器ContentHandler接口,负责对发送的事件响应和进行XML文档处理

为了简化开发提供了ContentHandler的实现类DefaultHandler类

//事件处理器

public class MyContentHandler extends DefaultHandler{
			//文档解析开始时调用,该方法只会调用一次
			@Override
			public void startDocument() throws SAXException {
				super.startDocument();
			}
			//标签开始时调用
			@Override
			public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
				 //uri:xml文档的命名空间(用不到)
				 //localName:标签的名字(用不到)
				 //qName:带命名空间的标签的名字(使用标签名用这个)
				 // attributes:标签的属性集
				super.startElement(uri, localName, qName, attributes);
			}
			//解析标签的内容的时候调用
			@Override
			public void characters(char[] ch, int start, int length) throws SAXException {
				//ch:当前读取到的TextNode(文本节点)的字节数组
				//start:字节开始的位置,为0则读取全部
				//length:当前TextNode的长度 
				super.characters(ch, start, length);
			}
			//标签结束时调用
			@Override
			public void endElement(String uri, String localName, String qName) throws SAXException {
				super.endElement(uri, localName, qName);
			}
			//文档解析结束后调用,该方法只会调用一次
			@Override
			public void endDocument() throws SAXException {
				super.endDocument();
			}
		}

//解析器

//获取解析器工厂对象,从而获取解析器对象

SAXParserFactory factory = SAXParserFactory.newInstance();

SAXParser parser = factory.newSAXParser();

//使用指定的DefaultHandler解析指定文件

parser.parse(new File("文件名.xml"), new MyContentHandler());

四、pull解析

Xmlpull比Sax更简明,而且不需要扫描完整个流

步骤:

//导入kxml2-2.3.0.jar    xmlpull_1_1_3_4c.jar第三方jar包

//获取解析器工厂对象,从而获取解析器对象
	XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
	XmlPullParser parser = factory.newPullParser();
	//关联xml文件
	parser.setInput(new FileInputStream("文件名.xml"), "utf-8");
	//获取事件类型
	int type = parser.getEventType();
		//XmlPullParser.START_DOCUMENT;	文档开始事件0
		//XmlPullParser.END_DOCUMENT;	文档结束事件1
		//XmlPullParser.START_TAG; 	开始标签事件2
		//XmlPullParser.END_TAG; 	结束标签事件3
		//XmlPullParser.TEXT;	代表文本4
	while (type != XmlPullParser.END_DOCUMENT) {
		String tagName = parser.getName();
		switch (type) {
			case XmlPullParser.START_TAG:
				if("标签名".equals(tagName)){
					//操作(javabean)
				}else if("标签名".equals(tagName)){
					//...
				}
				break;
			case XmlPullParser.END_TAG:
				if("标签名".equals(tagName)){
					//操作(add)
				}
				break;
		}
		//让指针跳到下一行,重新给type赋值,不然就会死循环
		type = parser.next()
	}
	//把内存中的数据序列化到硬盘上去永久保存
	//获取解析器工厂对象,从而获取序列化器
	XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
	XmlSerializer serializer = factory.newSerializer();
	//设置输出流关联xml文件
	serializer.setOutput(new FileOutputStream("文件名.xml"), "utf-8");
	//写入文档声明(文档开始)
	serializer.startDocument("utf-8", true);//参数二:文档是否独立
	//写入开始根标签
	serializer.startTag(null, "students");//参数1 命名空间一般给null 参数2 标签名称
	//写入根标签的子标签student开始标签
	serializer.startTag(null, "student");
	serializer.attribute(null, "id", "id值");//写入属性
	//写入student标签的子标签name开始标签
	serializer.startTag(null, "name");
	//写入name标签内文本
	serializer.text("文本内容");
	//写入name结束标签
	serializer.endTag(null, "name");
	//同样方法写student标签的子标签age
	//写入student结束标签
	serializer.endTag(null, "student");
	//同样方法写多个student,一般使用循环
	//写入结束根标签
	serializer.endTag(null, "students");
	//文档结束
	serializer.endDocument();
时间: 2024-10-25 09:48:38

XML可扩展标记语言的相关文章

关于XML(可扩展标记语言)的基础知识与写法------2017-05-18

XML(Extensible Markup Language) HTML:超文本标记语言,主要用来展示   XML:可扩展标记语言,用来做数据传输XML特点: 1.树状结构,有且只有一个根 2.标签名自定义 3.标签名很敏感,都是双标签元素 4.同一级下不能出现重名标签 例子:用XML来获取login表中的name列: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <tit

Java XML可扩展标记语言(eXtensible Markup Language)

一.XMl 1.1.XML简介:  XML指可扩展标记语言(eXtensible Markup Language),它是一种很像HTML的标记语言.XML的设计宗旨是传输数据,焦点是数据的内容,而HTML被设计用来显示数据,其焦点是数据的外观.XML是不会做任何事情的,它只是被设计用来结构化.存储以及传输信息. 1 <mail> 2 <from>tom</from> 3 <to>lily</to> 4 <detail>I will g

xml(可扩展标记语言)

XML 数据存储 1.XML 语法特点 1 严格区分大小写2 有且只有一个根节点3 有开始和结束标签4 属性必须使用'"'5 没有预定义标签,与html不一样6 文档声明: <?xml verslon="1.0" encoding="utf-8"?>    //verslon="1.0" 版本7 注释:<!-->8 CDATA:即原意文本-<![CDATA[...]]>9 注意编码问题,文本文件实际编

第三章 可扩展标记语言XML

==========================第三章====================== XML(可扩展标记语言)的作用: 用于传输和存储数据的,并且对数据有一定的描述性. 没有预定义标签,用户可以自定义标签. XML最好的描述是:XML 是独立于软件和硬件的信息传输工具.即不依赖于任何软件,没有语言上的问题.任何一个可编辑文本的软件即可编写XML文件. HTML(超文本标记语言)的作用: 用于显示数据. XML的用途: 1.作为应用程序的配置文件 2.作为应用程序的数据源 3.平

XML简介——可扩展标记语言(Extensible Markup Language)

(What) XML是什么? XML指可扩展标记语言(Extensible Markup Language) 1.  XML是一种标记语言,类似HTML. 2.  XML具有自我描述性 3.  XML被设计来传输和数据(设计宗旨/目的) XML和HTML的关系和区别 XML是HTML的补充,不是取代. 相同之处:1.两者都是标记语言.2.都是W3C的推荐标准 不同之处:1.(目的不同)xml被设计来传输和存储数据,重点是数据的内容:html被设计来显示数据,重点是数据的显示.2.(标签不同)xm

第八章 可扩展标记语言XML

1.什么是XML? XML:Extensible Markup Language(可扩展标记语言) HTML:HyperLink Text  Markup Language(超文本标记语言) 2.xml文件和html文件的区别? 01.xml严格区分大小写,html不区分 02.xml不是编译语言,xml和html都是解释型语言 03.html语言负责显示数据,而Xml文件就是专门用来存储数据 3.xml书写注意点 1.xml文件严格区分大小写  2.标签配对出现  3.xml文档只能有一个根节

关于XML(可扩展标记语言)的基础知识与写法

XML(Extensible Markup Language) HTML:超文本标记语言,主要用来展示   XML:可扩展标记语言,用来做数据传输XML特点:1.树状结构,有且只有一个根2.标签名自定义3.标签名很敏感,都是双标签元素4.同一级下不能出现重名标签 例子:用XML来获取login表中的name列:   <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title

扩展标记语言-XML

XML 指可扩展标记语言(eXtensible Markup Language).XML 被设计用来传输和存储数据.XML 很重要,也很容易学习.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::XML 简介XML 被设计用来传输和存储数据.ht tp://www.iis7.com/HTML 被设计用来显示数据..............什么是 XML?XML 指可扩展标记语言(EXtensible Markup Langua

可扩展标记语言XML

1.HTML(Hyper Text MarkUp language) 超文本标记语言 XML(Extendsible Markup Language) 可扩展性标记语言1)html负责显示数据,xml侧重的存储数据2)html标签W3C定制好的,xml程序员手动定制. 2.RSS订阅器. 配置文件都是xml. Word文档底层使用xml存储. 3.xml文件的根节点只能有一个. root一个根节点对象. root.ChilNodes子节点集合. Java1.7支持String类型,但是一直报错.