01_XML基础

前端之家收集整理的这篇文章主要介绍了01_XML基础前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
一、XML概述
XML是指可扩展标记语言(eXtensible Markup Language),它是一种标记语言
作用:
它被设计的宗旨是用于表示数据的。
XML还经常作为配置文件
二、XML的语法(记住)
1、XML的声明
必须出现在第一行,严格意义上的第一行.
最简单的形式:<?xml version="1.0"?>
encoding:指示解析器在解析XML中数据时使用的编码,默认是UTF-8
2、CDATA区:
作用:把标签当做普通的文本对待
语法<![CDATA[文本内容]]>
三、XML的约束(知道)
约束就是一个规定
格式良好的XML:遵循XML语法的XML
有效的XML:遵循约束文档的XML
四、DTD约束(理解)
1、DTD(Document Type Definition):文档类型定义。
2、DTD如果是在一个单独的文件中定义的,文件保存时必须使用UTF-8
3、如何在xml中引入外部的dtd文档(必须会)
3.1dtd文档在本地:<!DOCTYPE 根元素 SYSTEM "DTD文档路径">
3.2dtd文档不在本地:<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
4、看懂DTD文档
< ?xml version = "1.0" encoding = "gbk" ? >
< !DOCTYPE TVSCHEDULE [
< !ELEMENT TVSCHEDULE (CHANNEL +) >
< !ELEMENT CHANNEL (BANNER,DAY +) >
< !ELEMENT BANNER (#PCDATA) >
< !ELEMENT DAY (DATE,(HOLIDAY |PROGRAMSLOT +) +) >
< !ELEMENT HOLIDAY (#PCDATA) >
< !ELEMENT DATE (#PCDATA) >
< !ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION ?) >
< !ELEMENT TIME (#PCDATA) >
< !ELEMENT TITLE (#PCDATA) >
< !ELEMENT DESCRIPTION (#PCDATA) >
< !ATTLIST TVSCHEDULE NAME CDATA #required >
< !ATTLIST CHANNEL CHAN CDATA #required >
< !ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED >
< !ATTLIST TITLE RATING CDATA #IMPLIED >
< !ATTLIST TITLE LANGUAGE CDATA #IMPLIED >
] >
<TVSCHEDULE NAME = "湖北电视台" >
<CHANNEL CHAN = "湖北卫视" >
<BANNER >旗帜 < /BANNER >
<DAY >
<DATE > 2013< /DATE >
<HOLIDAY >十月一日 < /HOLIDAY >
<HOLIDAY >五月一日 < /HOLIDAY >
< /DAY >
<DAY >
<DATE > 2012< /DATE >
<PROGRAMSLOT VTR = "排程1" >
<TIME >时间 < /TIME >
<TITLE >标题 < /TITLE >
< /PROGRAMSLOT >
<PROGRAMSLOT >
<TIME >时间 < /TIME >
<TITLE RATING = "下午" LANGUAGE = "普通话" >标题 < /TITLE >
<DESCRIPTION >描述 < /DESCRIPTION >
< /PROGRAMSLOT >
< /DAY >
< /CHANNEL >
< /TVSCHEDULE >
五、XML的数据解析

定义XML时的约束形式

  |-DTD

  |-Schema

解析XML的方式

  |-DOMDocumentObjectModel)解析

  优点:W3C推出模型,非常适合增删改查(CRUD

    缺点:必须把XML文件全部读入内存才可以操作

  |-SAXSimpleAPIforXML)解析

  优点:在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作

    缺点:只能进行查询

解析时用到的开发包:

  |-dom4j

    是开源组织推出的解析开发包。最好的,都在用。

  |-JAXP(JavaAPIforXMLProcessing)

    是SUN公司推出的解析标准实现。

org.w3c.dom:提供DOM方式解析XML的标准接口

org.xml.sax:提供SAX方式解析XML的标准接口

javax.xml:提供了解析XML文档的类

  |-JDom

是开源组织推出的解析开发包。

六、JAXP之DOM解析
Jaxp DOM解析的基本操作
<?xmlversion="1.0"encoding="UTF-8"standalone="no"?><书架>
<>
<书名>Java就业培训教程</书名>
<作者>张三丰</作者>
<售价>33.00元</售价>
</>
<>
<书名>高数 </书名>
<作者>小明 </作者>
<售价>21.00元</售价>
</>
</书架>
public classjaxp_CRUD_exercise {
public static voidmain(String[] args) throwsException {
//首先得到 doucment,先得到工厂,再由工厂得到DocumentBuilder,最后得到Document.
DocumentBuilderFactory dbf = DocumentBuilderFactory. newInstance ();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse( "src/book.xml" );
test7 (document);
}
//1、得到某个具体的节点内容:第2本书的主体内容 <书名>葵花宝典</书名>
private static voidtest1(Document document){
//根据书名获取标签
NodeList nl = document.getElementsByTagName( "书名" );
//第二本书,得到第二个书名标签
Node node = nl.item( 1);
//获取主体内容
String str = node.getTextContent();
System. out .println(str);;
}
//2、遍历所有元素节点:递归。打印遍历到的元素名称,Document继承Node,传递Document进来即可
private static voidtest2(Node node){
//判断元素是否为一个元素节点,如果是就打印
if (node.getNodeType() ==Node. ELEMENT_NODE ){
System. out .println(node.getNodeName());
}
//再得到子类,调用自己进行遍历
NodeList nl = node.getChildNodes();
for ( intx = 0;x <nl.getLength();x ++){
Node cn = nl.item(x);
test2 (cn);
}
}
//3、修改某个元素节点的主体内容:第2本书售价改为2元
private static voidtest3(Document document) throwsException {
//根据书名获取标签
NodeList nl = document.getElementsByTagName( "售价" );
//第二本书,得到第二个书名标签
Node node = nl.item( 1);
//获取主体内容
node.setTextContent( "2.00元" );
Transformer ts = TransformerFactory. newInstance ().newTransformer();
ts.transform( newDOMSource(document),newStreamResult( "src/book.xml" ));
}
//4、向指定元素节点中增加子元素节点:给第一本书增加一个<内部价>58.00元</内部价>
private static voidtest4(Document document) throwsException {
//根据书名获取标签
Element e = document.createElement( "内部价" ); //创建内部价标签
e.setTextContent( "58.00元" );
//得到第一本元素
Node fnode = document.getElementsByTagName( "书" ).item( 0);
//把新元素驾到第一本书上.
fnode.appendChild(e);
Transformer ts = TransformerFactory. newInstance ().newTransformer();
ts.transform( newDOMSource(document),newStreamResult( "src/book.xml" ));
}
//5、向指定元素节点上增加同级元素节点,售价上面增加批发价
private static voidtest5(Document document) throwsException {
//创建新元素
Element e = document.createElement( "批发价" ); //创建内部价标签
e.setTextContent( "48.00元" );
//得到插入点的标签(售价),需要父节点才可以操作子节点
Node node = document.getElementsByTagName( "售价" ).item( 0);
Node pNode = node.getParentNode();
pNode.insertBefore(e,node);
Transformer ts = TransformerFactory. newInstance ().newTransformer();
ts.transform( newDOMSource(document),newStreamResult( "src/book.xml" ));
}
//6、删除指定元素节点:删除批发价
private static voidtest6(Document document) throwsException {
//1.获取批发价的节点
Node node = document.getElementsByTagName( "批发价" ).item( 0);
//2.删除节点,必须有批发价的父节点来做
node.getParentNode().removeChild(node);
//3.写入文件
Transformer ts = TransformerFactory. newInstance ().newTransformer();
ts.transform( newDOMSource(document),newStreamResult( "src/book.xml" ));
}
//7、操作XML文件属性:给第一本书添加属性出版社="小马"
private static voidtest7(Document document) throwsException{
//1.获取第一本书的节点
//Node node = document.getElementsByTagName("书").item(0);
Element e = (Element)document.getElementsByTagName( "书" ).item( 0);
//2.给第一本书增加属性
e.setAttribute( "出版社","小马" );
//3.写入文件
Transformer ts = TransformerFactory. newInstance ().newTransformer();
ts.transform( newDOMSource(document),newStreamResult( "src/book.xml" ));
}


}
七、JAXP之SAX解析
Jaxp SAX解析(练习:把书的信息封装到JavaBean中)
public classMySAX3_exercise {
//把书中的数据封装到JavaBeam中.
public static voidmain(String[] args) throwsException {
//得到解析器SAXSparer
SAXParser parser = SAXParserFactory. newInstance ().newSAXParser();
//得到读取器
XMLReader reader = parser.getXMLReader();
//定义一个集合,存储JavaBeam
List <Book > books = newArrayList() ;
//给读取器注册事件处理器,使用
reader.setContentHandler( newMyContentHandler2(books));
}
}
//创建注册事件注册器,把读到的数据存入到JavaBeam中.
classMyContentHandler2 extendsDefaultHandler{
//定义一个集合容器,引用主函数中的集合
privateList <Book >books ;
publicMyContentHandler2(List <Book > books){
this . books =books;
}
//定义一个容器类
privateBookbook ;
//定义一个容器字符串
privateStringcurrentTagName ;
public voidstartElement(String uri,String localName,
String qName,Attributes attributes) throwsSAXException {
//如果读到的是书,创建book对象
if ( "书" .equals(qName)){
book = newBook();
}
currentTagName = qName;
}
public voidcharacters( char [] ch,intstart,intlength)
throwsSAXException {
if ( currentTagName .equals( "书名" ))
book .setName( newString(ch,start,length));
if ( currentTagName .equals( "作者" ))
book .setAuthor( newString(ch,length));
if ( currentTagName .equals( "售价" ))
book .setPrice( newString(ch,length));
}
public voidendElement(String uri,String qName)
throwsSAXException {
//如果读到的是书,把book对象加到集合中去
if ( "书" .equals(qName)){
books .add( book );
}
currentTagName =null ;
} }
八、DOM4J操作
基本操作(练习:PPT 44 7个练习,不要采用main方法进行测试,请使用单元测试)
public classdom4j_exercise {
// DOM4J的使用
public static voidmain(String[] args) throwsException {
// 得到解析器
SAXReader reader = newSAXReader();
// 得到Document,
Document document = reader.read( "src/book.xml" );
// test1(document);
// test2(document.getRootElement());
test7 (document);
}
// 1、得到某个具体的节点内容:第2本书的作者
private static voidtest1(Document document) throwsException{
// 1.得到根元素
Element root = document.getRootElement();
// 2.得到根元素书里面所有(书)元素的集合(只得到儿子,不得到孙子),注意不是get方法,是element.
List <Element > books =root.elements( "书" ) ;
// 3.得到第二本书
Element secondBook = books.get( 1);
// 4.得到书中的(作者)元素
Element author = secondBook.element( "作者" );
System. out .println(author.getTextTrim());
}
// 2、遍历所有元素节点:只打印元素的名称
private static voidtest2(Element element) throwsException{
System. out .println(element.getName());
// 一下代码copyDOM4J文档说明Fast Looping
for( inti = 0,size = element.nodeCount(); i < size; i ++) {
Node node = element.node(i);
if(node instanceofElement) {
test2 ((Element) node);
} else{
// do something....
}
}
}
// 3、修改某个元素节点的主体内容
// 第二本书售价由2.00元变为1.00元
private static voidtest3(Document document) throwsException{
// 1.得到根元素
Element root = document.getRootElement();
// 2.得到根元素书里面所有(书)元素的集合(只得到儿子,不得到孙子)注意不是get方法,是element.
List <Element > books =root.elements( "书" ) ;
// 3.得到第二本书
Element secondBook = books.get( 1);
// 4.得到书中的(售价)元素,修改
Element price = secondBook.element( "售价" );
price.setText( "1.00元" );
// 5.写入到文件.复制DOM4J文档说明Writing a document to a file
// OutputFormat format = OutputFormat.createPrettyPrint();//好看的,默认的输出格式.
OutputFormat format = OutputFormat. createCompactFormat (); // 不好看的,机器看的
format.setEncoding( "UTF-8" ); // 设置编码
XMLWriter writer = newXMLWriter( newFileOutputStream( "src/book.xml" ),
format);
// XMLWriter writer = new XMLWriter(new
// FileOutputStream(" src /book.xml"));
writer.write(document);
writer.close();
}
// 4、向指定元素节点中增加子元素节点 :在第一本书增加内部价节点,48.00元
private static voidtest4(Document document) throwsException{
// 1.创建元素DocumentHelper,这个类可以创建好多东西;
Element e = DocumentHelper. createElement ( "内部价" ).addText( "48.00元" );
// 2.添加元素到文档中,有父亲才可以添加.
document.getRootElement().element( "书" ).add(e);
// 3.写入元素
XMLWriter writer = newXMLWriter( newFileOutputStream( "src/book.xml" ));
writer.write(document);
writer.close();
}
// 5、向指定元素节点上增加同级元素节点,在售价上增加批发价58.00元.
private static voidtest5(Document document) throwsException{
// 1.创建元素DocumentHelper,这个类可以创建好多东西;
Element e = DocumentHelper. createElement ( "批发价" ).addText( "58.00元" );
// 2.添加元素到文档中,得到第一本书的孩子们,他们在一个集合中,操作这个集合即可.
Element book = document.getRootElement().element( "书" );
List <Element > list =book.elements() ;
// 3.批发价是插入到第三个元素,index为2
list.add( 2,e);
// 4.写入元素
XMLWriter writer = newXMLWriter( newFileOutputStream( "src/book.xml" ));
writer.write(document);
writer.close();
}
// 6、删除指定元素节点:删除第一本书的批发价
private static voidtest6(Document document) throwsException{
// 1.删除元素,操作这个集合即可.
Element book = document.getRootElement().element( "书" );
List <Element > list =book.elements() ;
// 2.批发价是插入到第三个元素,index为2
list.remove( 2);
// 3.写入元素
XMLWriter writer = newXMLWriter( newFileOutputStream( "src/book.xml" ));
writer.write(document);
writer.close();
}
// 7、操作XML文件属性:第二本书添加出版社="传智"
private static voidtest7(Document document) throwsException {
// 1.得到根元素
Element root = document.getRootElement();
// 2.找到第二本书,增加属性,因为是第二本,不是第一本,所以要从集合里区.第一本直接取
Element book2 = (Element)root.elements( "书" ).get( 1);
book2.addAttribute( "出版社","小智" );
// 3.写入元素
XMLWriter writer = newXMLWriter( newFileOutputStream( "src/book.xml" ));
writer.write(document);
writer.close();
} }
九、JUnit单元测试和debug调试
public classMyMathTest{

private staticMyMathmm ;
@BeforeClass
public static voidaa(){
System. out .println( "aa" );
mm = newMyMath();
}
@AfterClass
public static voidbb(){
System. out .println( "bb" );
mm =null ;
}
//@Before//表示应该先运行
//public voidaa (){
//System.out.println(" aa ");
//mm= new MyMath();
//}
//@After//表示应该后运行
//public voidbb (){
//System.out.println(" bb ");
//mm= null;
//}
//测试方法:public 没有返回值的,没有方法参数
@Test (timeout = 10)
public voidtestAdd() {
intresult =mm .add( 1, 2);
//不要打印,利用assertEquals方法进行判断
assertEquals ( 3,result);
} }
//测试方法是public,没有返回值的,没有方法参数
@Test
public voidt1() throwsException{
//单元测试其实就是在测试方法体中,调用一次要测试的方法后者类即可.
SAXReader reader = newSAXReader();
Document document = reader.read( "src/book.xml" );
//向需要测试的方法中传值document.
Dom4j_exercise. test1 (document);
}
public static voidtest1(Document document) throwsException {
Element root = document.getRootElement();
List <Element > books =root.elements( "书" ) ;
Element secondBook = books.get( 1);
Element author = secondBook.element( "作者" ); System. out .println(author.getTextTrim()); }

猜你在找的XML相关文章