XML文档的使用方法
一、
怎么样去写一个xml
- XML的定义:xml:可扩展标记语言 所有的标签都可以自定义 根据项目的需要和实际的场景进行自定义
- xml的作用
a. xml是配置文件的载体
b.xml可以做为数据传输的载体 - xml的书写规范
a.xml有一个良好的结构 必须有且只有一个根标签 正确嵌套
b.xml的标签是以尖括号包裹关键字成对出现 有开始有结束 关键字自定义
c.xml可以有属性 属性格式:属性="属性值" 多个属性之间使用空格
d.xml可以有空标签
e.xml区分大小写 - xml的组成
a.文档声明:<?xml version="1.0" encoding="UTF-8"?> version:版本号 encoding:告知浏览器的解码方式
b.根标签:只能有一个根元素
c.普通标签(标签名可以完全自定义)
d.属性(属性也可以完全自己定义)
e.文本
f.CDATA区:就是将原文显示(原文中可以包括特殊字符)![]()
二、怎么样去约束一个xml
- XML的约束的作用:指导怎样去写一个xml文件,需要符合约束条件(例如上图中,book必须要有 bookname的属性,这种情况就可以写XML约束)
- xml约束的种类
a.DTD约束 (主要用于JAVAEE开发中)
b.Schema约束(主要用于android开发中)
- DTD约束
- DTD约束的格式
<!ELEMENT BookStore (book+)><!ELEMENT book (name,author,price)><!ELEMENT name (#PCDATA)><!ELEMENT author (#PCDATA)><!ELEMENT price (#PCDATA)><!ATTLIST book bookname CDATA #REQUIRED>
注意事项: 约束声明内容和标签名之间一定要有空格,否则会报错。 - DTD约束的引入方式:
- 内部DTD:DTD约束写在XML文件内部
格式<!DOCTYPE BookStore [约束体]><?xml version="1.0" encoding="UTF-8"?><!DOCTYPE BookStore [<!ELEMENT BookStore (book+)><!ELEMENT book (name,author,price)><!ELEMENT name (#PCDATA)><!ELEMENT author (#PCDATA)><!ELEMENT price (#PCDATA)><!ATTLIST book bookname CDATA #REQUIRED>]><BookStore><book bookname="JavaEE"><name><![CDATA[java入门到精通]]></name><author>张三</author><price>998</price></book><book bookname="android"><name><![CDATA[ANDROID入门到精通]]></name><author>张三</author><price>998</price></book></BookStore>
- 外部DTD:DTD文件在本地,通过引入的方式加载
格式:<!DOCTYPE BookStore SYSTEM "DTD文件的名字.dtd"><!DOCTYPE BookStore SYSTEM "BOOK.dtd">
- DTD文件在互联网:<!DOCTYPE bookstore PUBLIC "dtd的名称(标识符)" "dtd的互联网地址">
示例:struts2的默认配置文件![]()
hibernate的配置文件![]()
dtd的名称书写标准:
ISO标准以ISO字母开头
改进的非ISO的DTD以“+”号开头
未被改进的非ISO标准的DTD以“-”号开头
dtd的名称的含义:
//DTD所有者的名称//DTD描述的文件类型//语言的种类 - Schema约束
- Schema约束的简介:schema约束的源文件的后缀名.xsd schema约束本身也是一个xml
- Schema的命名空间:
- 在.xsd文件中:
<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://www.w3.org/2001/XMLSchema"targetNamespace="http://www.example.org/demo1"xmlns:tns="http://www.example.org/demo1"elementFormDefault="qualified"><element name="BookStore"><complexType><!-- 复杂的内容如果有子标签就需要写这个 --><sequence maxOccurs="1"><!-- 顺序标签 minOccurs:代表最少出现 maxOccurs最大出现次数 参数可以是unbounded代表无限次 --><element name="book"><complexType><sequence><element name="name" type="string" ></element><element name="author" type="string" ></element><element name="price" type="string" ></element></sequence><attribute name="bookname" type="string" use="optional"></attribute></complexType></element></sequence></complexType></element></schema>
xmlns:引入schema的命名空间 要使用哪个schema对我进行约束targetNamespace:命名空间 标识这个schema的命名空间 - 在bookstore.xml中
<BookStorexmlns="http://www.example.org/demo1"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.example.org/demo1 demo1.xsd">
xmlns:要引入schema的命名空间xmlns:xsi:固定写法 代表本xml是一个schema的实例xsi:schamaLocation:代表真正的引入schema 写法:命名空间 和 schema的地址
三、怎么样去解析一个xml
- xml的解析方式
- DOM解析:先将文档全部加载内存
- SAX解析:边读边解析的方式
- PULL解析:边读边解析的方式
问题:DOM解析和SAX解析的区别?
dom解析 先将文档全部加载内存 可以支持文档的增删改查的操作 并且支持文档的回写.
sax解析 边读边解析的方式 不支持文档的增删改的操作 并且不支持文档的回写 - xml的解析技术
- JAXP:sun公司 官方提倡使用的解析技术 既包括dom解析的API 也包括SAX解析的API
- JDOM:开源组织的开源的api 支持DOM解析
- DOM4J:是JDOM增强版 支持DOM解析
- XML解析案例
- dom4j解析xml(全部文档加载并解析)
准备工作:准备dom4j的jar 并且导入需要使用解析的工程
解析步骤:
(1)创建解析器
(2)加载需要解析文件
(3)获取根标签元素
(4)根据需求去解析想要的数据// (1)创建解析器SAXReader sr=new SAXReader();// (2)加载需要解析文件String path = Demo4j.class.getClassLoader().getResource("MyXml.xml").getPath();File f=new File(path);Document dou= sr.read(f);// (3)获取根标签元素Element root=dou.getRootElement();// (4)根据需求去解析想要的数据List <Element> list=root.elements();for(Element e:list){System.out.println(e.elementText("name"));}
涉及的方法:获得解析器:SaxReader reader = new SaxReader()加载xml文件:reader.read(uri);获取根元素:root document.getRootElement();获得所有的子元素:elements()获得指定的元素:element(String TagName)获得属性对象:Attribute attribute(String AttrName)获得所有的属性对象:attributes();获得属性值:attr.getValue()宿主标签对象直接获得属性值:attributeValue(String AttrName)获得文本element.getText()通过 父元素直接获得子元素的文本内容:父标签的element.elementText(); - pull解析(边读边解析。解析一条抛一条)
准备工作:导入pull解析的jar包到需要解析的工程
解析步骤:
(1) 创建解析器工厂
(2) 使用工厂去制造一个解析器
(3) 将需要解析的文档放到解析器中
(4) 进行解析
案例详解:import java.util.ArrayList;import java.util.List;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserFactory;public class Pull{/*** @param args* @throws Exception*/public static void main(String[] args) throws Exception{// TODO Auto-generated method stubList<Book> li = null;Book b = null;// (1) 创建解析器工厂XmlPullParserFactory factory = XmlPullParserFactory.newInstance();// (2) 使用工厂去制造一个解析器XmlPullParser xp = factory.newPullParser();// (3) 将需要解析的文档放到解析器中xp.setInput(Pull.class.getClassLoader().getResourceAsStream("MyXml.xml"), "UTF-8");// (4) 进行解析// 需求:将文档中的数据保存到一个集合int type = 0;while ((type = xp.getEventType()) != XmlPullParser.END_DOCUMENT){String name = xp.getName();System.out.println(name);switch (type){case XmlPullParser.START_TAG:if ("BookStore".equals(name)){li = new ArrayList<Book>();}else if ("book".equals(name)){b = new Book();b.setBookname(xp.getAttributeValue(0));}else if ("name".equals(name)){b.setName(xp.nextText());}else if ("author".equals(name)){b.setAuthor(xp.nextText());}else if ("price".equals(name)){b.setPrice(Integer.parseInt(xp.nextText()));}break;case XmlPullParser.END_TAG:if ("book".equals(name)){li.add(b);}break;}xp.next();}for (Book book : li){System.out.println(book);}}}
注意,每个标签选择结束后,需要移动到下一个元素,空白处也是元素(取值为null)




浙公网安备 33010602011771号