一、
怎么样去写一个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中
<BookStore
xmlns="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的地址
例子:spring的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 stub
List<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)
时间: 2024-07-31 10:34:51