XML⽂档的使⽤⽅法
⼀、怎么样去写⼀个xml
1. XML的定义:xml:可扩展标记语⾔所有的标签都可以⾃定义根据项⽬的需要和实际的场景进⾏⾃定义
2. xml的作⽤
a. xml是配置⽂件的载体
3. xml的书写规范
4. xml的组成
a.⽂档声明:<?xml version="1.0" encoding="UTF-8"?> version:版本号 encoding:告知浏览器的解码⽅式
b.根标签:只能有⼀个根元素
c.普通标签(标签名可以完全⾃定义)
d.属性(属性也可以完全⾃⼰定义)
e.⽂本
f.CDATA区:就是将原⽂显⽰(原⽂中可以包括特殊字符)
⼆、怎么样去约束⼀个xml
1. XML的约束的作⽤:指导怎样去写⼀个xml⽂件,需要符合约束条件(例如上图中,book必须要有 bookname的属性,这种情况就可以写XML约束)
2. xml约束的种类
a.DTD约束 (主要⽤于JAVAEE开发中)
b.Schema约束(主要⽤于android开发中)
1. DTD约束
1. DTD约束的格式
<!ELEMENT BookStore (book+)>
<!ELEMENT book (name,author,price)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ATTLIST book bookname CDATA #REQUIRED>
注意事项:约束声明内容和标签名之间⼀定要有空格,否则会报错。
2. DTD约束的引⼊⽅式:
1. 内部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>
2. 外部DTD:DTD⽂件在本地,通过引⼊的⽅式加载
格式:<!DOCTYPE BookStore SYSTEM "DTD⽂件的名字.dtd">
<!DOCTYPE BookStore SYSTEM "BOOK.dtd">
3. DTD⽂件在互联⽹:<!DOCTYPE bookstore PUBLIC "dtd的名称(标识符)" "dtd的互联⽹地址">
⽰例:struts2的默认配置⽂件
hibernate的配置⽂件
dtd的名称书写标准:
ISO标准以ISO字母开头
改进的⾮ISO的DTD以“+”号开头
未被改进的⾮ISO标准的DTD以“-”号开头
dtd的名称的含义:
//DTD所有者的名称//DTD描述的⽂件类型//语⾔的种类
2. Schema约束
1. Schema约束的简介:schema约束的源⽂件的后缀名.xsd schema约束本⾝也是⼀个xml
2. Schema的命名空间:
1. 在.xsd⽂件中:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="/2001/XMLSchema"
targetNamespace="/demo1"
xmlns:tns="/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的命名空间
2. 在l中
<BookStore
xmlns="/demo1"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/demo1 demo1.xsd"
>
xmlns:要引⼊schema的命名空间
xmlns:xsi:固定写法代表本xml是⼀个schema的实例
xsi:schamaLocation:代表真正的引⼊schema 写法:命名空间和 schema的地址
例⼦:spring的Schema约束的引⼊
三、怎么样去解析⼀个xml
1. xml的解析⽅式
1. DOM解析:先将⽂档全部加载内存
2. SAX解析:边读边解析的⽅式
3. PULL解析:边读边解析的⽅式
问题:DOM解析和SAX解析的区别?
dom解析先将⽂档全部加载内存可以⽀持⽂档的增删改查的操作并且⽀持⽂档的回写.
sax解析边读边解析的⽅式不⽀持⽂档的增删改的操作并且不⽀持⽂档的回写
2. xml的解析技术
1. JAXP:sun公司官⽅提倡使⽤的解析技术既包括dom解析的API 也包括SAX解析的API
2. JDOM:开源组织的开源的api ⽀持DOM解析
3. DOM4J:是JDOM增强版⽀持DOM解析
3. XML解析案例
1. dom4j解析xml(全部⽂档加载并解析)
准备⼯作:准备dom4j的jar 并且导⼊需要使⽤解析的⼯程
解析步骤:
(1)创建解析器
(2)加载需要解析⽂件
(3)获取根标签元素
(4)根据需求去解析想要的数据
// (1)创建解析器
SAXReader sr=new SAXReader();
// (2)加载需要解析⽂件
String path = ClassLoader().getResource("l").getPath();
File f=new File(path);
Document dou= sr.read(f);
// (3)获取根标签元素
Element RootElement();
// (4)根据需求去解析想要的数据
List <Element> list=root.elements();
for(Element e:list)
{
System.out.println(e.elementText("name"));
dom4j读取xml}
涉及的⽅法:
获得解析器:SaxReader reader = new SaxReader()
加载xml⽂件:ad(uri);
获取根元素:RootElement();
获得所有的⼦元素:elements()
获得指定的元素:element(String TagName)
获得属性对象:Attribute attribute(String AttrName)
获得所有的属性对象:attributes();
获得属性值:Value()
宿主标签对象直接获得属性值:attributeValue(String AttrName)
获得⽂本Text()
通过⽗元素直接获得⼦元素的⽂本内容:⽗标签的element.elementText();
2. pull解析(边读边解析。解析⼀条抛⼀条)
准备⼯作:导⼊pull解析的jar包到需要解析的⼯程
解析步骤:
(1) 创建解析器⼯⼚
(2) 使⽤⼯⼚去制造⼀个解析器
(3) 将需要解析的⽂档放到解析器中
(4) 进⾏解析
案例详解:
import java.util.ArrayList;
import java.util.List;
lpull.v1.XmlPullParser;
lpull.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 = wInstance();
// (2) 使⽤⼯⼚去制造⼀个解析器
XmlPullParser xp = wPullParser();
// (3) 将需要解析的⽂档放到解析器中
xp.setInput(ClassLoader()
.getResourceAsStream("l"), "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.AttributeValue(0));
}
else if ("name".equals(name))
{
b.Text());
}
else if ("author".equals(name))
{
b.Text());
}
else if ("price".equals(name))
{
b.setPrice(Integer.Text()));
}
break;
case XmlPullParser.END_TAG:
if ("book".equals(name))
{
li.add(b);
}
break;
}
<();
}
for (Book book : li)
{
System.out.println(book);
}
}
}
注意,每个标签选择结束后,需要移动到下⼀个元素,空⽩处也是元素(取值为null)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论