【XML】

XML?

  • 可拓展的标记语言
  • 用途:
    – 用来保存数据
    – 做配置文件
    – 数据传输载体
  • 倒状树形结构,标签嵌套

写一个XML

文档声明

<?xml version="1.0" ?> //解析时的解析器
<?xml version="1.0" encoding="gbk" ?> //解析编码
<?xml version="1.0" encoding="gbk" standalone="yes" ?> //yes依赖或关联外部文件,no没有依赖或关联

encoding解析

  • 在解析xml时用什么编码去解析 - - -解码
  • ANSI电脑默认编码gbk,编码和解码的方式不同,会导致解码失败,乱码

元素<>标签

  • 成对出现
  • 必须要有一个根标签
  • 空标签< />
  • 可以自己定义

属性

  • 元素中添加属性

注释

  • < >中间 !-- –
  • 快捷键ctrl shift /
  • 必须在文档声明下面

非法字符转义

  • &lt;—— <
  • &gt;—— >

CDATA区

  • 服务端给客户端传数据时会使用
    < ![CDATA][<> </> ]>
  • 作用:内容包含了标签形式但不想让xml解析

XML解析方式

面试题

DOM解析

  • 把所有文档存到内存形成树形结构
  • 整个树状结构称为document对象,标签称为element对象,属性称为attribute对象,文本称为text对象)—— 统称为Node节点
  • 若xml特别大,会内存溢出
  • 可以对文件进行增删操作

SAX解析

  • Simpel API for xml 基于事件驱动,读取一行解析一行
  • 不会造成内存溢出
  • 不能增删,只能查询

针对XML解析方式给出的解决方案有哪些?

jaxp

  • sun公司,比较繁琐

jdom

dom4j

  • 使用广泛

dom4j

使用

  • 下载dom4j的jar包 —— dom4j-1.6.1.jar
  • 放在lib下build path一下
  • 代码:
		try {
			//1.创建sax对象
			SAXReader reader = new SAXReader();
			//2.制定解析xml源
			Document document = reader.read(new File("src/com/zd/xmltest/demo.xml"));
			//3.得到元素(根元素:getRootElement)
			Element rootElement = document.getRootElement();
			//4.得到根元素的子元素(stu)(.elements()得到所有的子元素)
			List<Element> elements = rootElement.elements();
			//5.遍历所有的元素(.getText()获取文本)
			for(Element e : elements){
				System.out.println(e.element("name").getText());
				System.out.println(e.element("age").getText());
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}

层级过多 —— XPath语法

  • 快速定为到某一元素selectNodes( )
  • /从aaa/到bbb/找ccc
  • //把所有的aaa找出来
  • 在dom4j的下载包中的lib里 —— jaxen-1.1-beta-6.jar
  • 代码
		try {
			//1.创建sax对象
			SAXReader reader = new SAXReader();
			//2.制定解析xml源
			Document document = reader.read(new File("src/com/zd/xmltest/demo.xml"));
			//3.得到元素(根元素:getRootElement)
			Element rootElement = document.getRootElement();
			
			List<Element> list = rootElement.selectNodes("//name");
			for(Element e : list){
				System.out.println(e.getText());
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}

XML约束

DTD

  • 可读性差,不易解析
  • <!ATTLIST 元素名称 属性名称 类型>
  • <!ELEMENT 元素名称 类型名>
  • 新建文件xml dtd的
  • 创建一个XXX.dtd文件写入简单元素和复杂元素
  • 代码:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT stus (stu)>
<!ELEMENT stu (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
  • 在xml中引入DTD文件
  • 网络引入:<>!DOCTYPE stus PUBLIC “//UNKNOWN/” “unknown.dtd”>
  • 本地引入:<>!DOCTYPE stus SYSTEM “demo.dtd”>
  • 内嵌定义:<>!DOCTYPE stus SYSTEM “demo.dtd”>
  • +代表一个或多个
  • *代表零个或多个
  • ?零个或一个
  • <!ELEMENT stu (name,age)>两个都有且顺序不变
  • <!ELEMENT stu (name|age)>两个元素有一个就行
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE stus [
	<!ELEMENT stus (stu)+>
	<!ELEMENT stu (name,age)>
	<!ELEMENT name (#PCDATA)>
	<!ELEMENT age (#PCDATA)>
]>
<stus>
	<stu>
		<name>张三</name>
		<age>18</age>
	</stu>
</stus>

Schema

  • 就是xml,解析方便,为了替代,没有真正替代
  • 新建文件 xml schema 的 XXX.xsd
  • 留下名称空间(xmlns:w3c的标准)、目标名称空间(targetNamespace:下面定义的元素都要与这个名称空间绑定)、elementFormDefault:元素的格式化情况
  • 先写元素,分为简单复杂元素用complexType>sequence>嵌套
  • 代码
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
	targetNamespace="http://www.example.org/Teacher" 
	elementFormDefault="qualified">
	<element name="stus">
		<complexType>
			<sequence>
				<element name="stu">
					<!-- 用来声明这是一个复杂元素的 -->
					<complexType>
						<sequence>
							<element name="name" type="string"></element>
							<element name="age" type="string"></element>
						</sequence>
					</complexType>
				</element>
			</sequence>
		</complexType>
	</element>
</schema>
  • 在xml中引入Schema文件
  • 在xml中写入根标签,提示选xsinsp选项
  • 加上xmlns=Schema文件的目标空间
  • xsi:schemaLocation="{namespace} {location}"
  • sequence maxOccurs=“unbounded”>可以不限子元素次数
<?xml version="1.0" encoding="UTF-8"?>
<stus
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.example.org/Teacher"
xsi:schemaLocation="http://www.example.org/Teacher Teacher.xsd">
	<stu>
		<name>张三</name>
		<age>18</age>
	</stu>
	
</stus>

名称空间的作用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值