XML解析,dom解析,Jdom解析

前端之家收集整理的这篇文章主要介绍了XML解析,dom解析,Jdom解析前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

XML是一门标记语言,主要作用是用来进行数据传输和配置保存的。XML文件内容主要由两部分组成:头信息,主体信息

头信息:
主要放入的是一些配置信息,例如:版本,编码,规则(dtd,xsd),导入样式文件(CSS,XSL)

主体信息里主要放入具体要说明的数据。

主体信息的组成:
1) 全部由节点(Node)组成,分为三类,节点都有两个固定的属性,Name,Value

a) 元素节点(Element),标签,只有name

b) 属性节点(Attribute),必须依附于元素节点存在,name和value同时存在

c) 文本节点(Text),具体的数据内容。只有value

2) 在这些节点之间存在关系:父子关系

a) 一个节点最多只能有一个父节点

b) 如果一个节点没有父节点,那么该节点称为根节点(Root)

c) 一个XML中只允许存在一个根节点

d) 只有元素节点可以有子节点,文本节点没有子节点,因此文本节点也称为叶子节点(Leaf)

如果想通过程序创建或读取XML文件,一般都使用一些解析工具完成,常用的解析方式有三种:

1) DOM解析:由w3c官方提供,所有语言都支持这种解析,解析方式是将整个文件读取到内存里,形成树型结构进行解析,代码清晰,但如果XML文件过大,会对内存造成压力。

DOM解析一般使用的Java语言,主要是用来完成XML的创建工作,通过查询到的数据库数据,建立一个XML文件,将文件传递给JavaScript。

  1. publicstaticvoidcreateXML(StringsavePath)throwsException{
  2. List<City>allCities=newArrayList<City>();
  3. Cityc=newCity();
  4. c.setId(1);
  5. c.setTitle("南通");
  6. allCities.add(c);
  7. c=newCity();
  8. c.setId(2);
  9. c.setTitle("南京");
  10. allCities.add(c);
  11. c=newCity();
  12. c.setId(3);
  13. c.setTitle("杭州");
  14. allCities.add(c);
  15. //建立Document核心操作对象
  16. Documentdocument=newDocument();
  17. //建立根节点
  18. Elementroot=newElement("allCity");
  19. //循环
  20. Iterator<City>iter=allCities.iterator();
  21. while(iter.hasNext()){
  22. c=iter.next();
  23. //建立所有元素节点
  24. ElementcityElement=newElement("city");
  25. ElementidElement=newElement("id");
  26. ElementtitleElement=newElement("title");
  27. //配置关系
  28. idElement.addContent(c.getId().toString());
  29. titleElement.addContent(c.getTitle());
  30. cityElement.addContent(idElement);
  31. cityElement.addContent(titleElement);
  32. root.addContent(cityElement);
  33. }
  34. //设置根节点
  35. document.setRootElement(root);
  36. //导出
  37. XMLOutputteroutputer=newXMLOutputter();
  38. //设置编码
  39. outputer.setEncoding("UTF-8");
  40. outputer.output(document,newFileWriter(newFile(savePath)));
  41. }
  42. publicstaticvoidmain(String[]args)throwsException{
  43. createXML("D:/jdom.xml");
  44. }



2) SAX解析:由SUN官方提供,特点是逐行解析,需要自行编写解析规则,思路很混乱,基本不推荐使用,优点是不会造成太大的内存压力。

3) 第三方提供的解析工具:结合SAX和DOM的优点,并将代码风格改为Java的风格,简化开发。典型的第三方解析工具是:JDOM,dom4j

  1. publicstaticvoidcreateXML(StringsavePath)throwsException{
  2. //这里准备一个假的List集合,保存着所有数据库查询到的数据
  3. List<City>allCities=newArrayList<City>();
  4. Cityc=newCity();
  5. c.setId(1);
  6. c.setTitle("南通");
  7. allCities.add(c);
  8. c=newCity();
  9. c.setId(2);
  10. c.setTitle("南京");
  11. allCities.add(c);
  12. c=newCity();
  13. c.setId(3);
  14. c.setTitle("杭州");
  15. allCities.add(c);
  16. //开始进行创建,也需要核心对象
  17. DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
  18. DocumentBuilderbuilder=factory.newDocumentBuilder();
  19. Documentdocument=builder.newDocument();
  20. //通过document可以建立各种类型的节点。
  21. //先建立根节点
  22. Elementroot=document.createElement("allCity");
  23. //里面循环建立多个元素节点
  24. Iterator<City>iter=allCities.iterator();
  25. while(iter.hasNext()){
  26. c=iter.next();
  27. //元素节点
  28. ElementcityElement=document.createElement("city");
  29. ElementidElement=document.createElement("id");
  30. ElementtitleElement=document.createElement("title");
  31. //建立文本节点
  32. TextidText=document.createTextNode(c.getId().toString());
  33. TexttitleText=document.createTextNode(c.getTitle());
  34. //设置各个节点间的关系
  35. idElement.appendChild(idText);
  36. titleElement.appendChild(titleText);
  37. cityElement.appendChild(idElement);
  38. cityElement.appendChild(titleElement);
  39. root.appendChild(cityElement);
  40. }
  41. //将root设置为根节点
  42. document.appendChild(root);
  43. //还要完成输出操作,需要通过其他的类来完成
  44. TransformerFactorytf=TransformerFactory.newInstance();
  45. Transformert=tf.newTransformer();
  46. //建立要导出的源对象
  47. Sources=newDOMSource(document);
  48. //导出的位置
  49. StreamResultresult=newStreamResult(newFile(savePath));
  50. //可以手工设置编码,默认使用当前项目的UTF-8编码
  51. t.setOutputProperty("encoding","UTF-8");
  52. //进行导出
  53. t.transform(s,result);
  54. }
  55. publicstaticvoidmain(String[]args)throwsException{
  56. //parseMappingXML("D:/News.hbm.xml");
  57. //parseWebXML("D:/web.xml");
  58. createXML("D:/dom.xml");
  59. }



XML基础和XML编程


XML的学习目标:

1.能够用xml描述有层次的数据关系.

2.能够用解析器读取xml中的有层次关系的数据.(parser)

一、XML是什么?作用是什么?

1、XML是指可扩展标记语言(eXtensibleMarkupLanguage),用户自定义标签.相对于HTML来讲的。

2、XML被设计的宗旨是表示数据。HTML是用来显示数据的。目前经常使用的XML版本是1.0

3、XML除了表示数据外。在实际的企业开发中,主要用XML作为程序的配置文件

二、XML的基本语法

1)文档声明

编写xml文件的时候,必须要添加声明.声明必须要出现在第一行,之前连空行都不能有.

最简单的文档声明:<?xmlversion="1.0"?>

如果要添加中文字符:需要给其设定encoding属性.

<?xmlversion="1.0"encoding="gbk"?>

standalone属性,用来说明xml文档是否独立.

注意:在写标点符号的时候,需要是英文的标点符号.

2)元素

a)一个xml的元素也可以叫做标签.这个必须要有开始和结束标签.

如果标签中没有标签,那么也可以简写成.例如:<北京/>

标签要合理的嵌套.不能够没爹没娘的嵌套.

一个xml文档必须有且仅有一个根标签.

b)xml中的空格和换行会被当做元素内容去处理,所以在实际开发过程中,需要将

空格和换行给去掉.响应的写成这样一种形式:

例如:<中国><北京/></中国>

3)属性

一个xml标签可以有多个属性,语法类似html中设置属性的语法.

<mytagname="value"/>

其中,标签中的属性也可以改写成这样一种形式:

<mytag>

<name>

<firstname></firstnamename>

<secondname></secondname>

</name>

</mytag>

4注释

注释的格式:<!--这是注释哦-->

注释也不能够嵌套.

xml中的注释不能够出现在第一行.

5.CDATA区、

CDATA(CharacterData)的缩写.实际开发过程中,一些数据可能不想让解析引擎处理.

就可以把它们放到CDATA区中

<![CDATA[

文本内容

]]>

特殊字符:

&&ampersand

>>greatthan

<<lessthan

""quotation

''apostrophe

6.处理指令(processinginstruction(PI)

<?xml-stylesheettype="text/css"href="s.css"?>

文档的声明也是一个处理指令

三、XML的约束

1、格式良好的XML文档:符合XML语法的。

2、有效的XML文档:遵循约束规范的。

格式良好的不一定是有效的,但有效的必定格式良好。

四、DTD的基本语法(看懂即可)

1、DTDDocumentTypeDefinition

2、作用:约束XML的书写规范。

3、DTD文件保存到磁盘时,必须使用UTF-8编码

4、如何引入外部的DTD文档来约束当前的XML文档

DTD文件在本地:<!DOCTYPE根元素名称SYSTEM"DTD文件的路径">

DTD文件在网络上:<!DOCTYPE根元素名称PUBLIC"DTD名称""DTD的路径URL">

5、DTD的语法细节

5.1定义元素

语法:<!ELEMENT元素名称使用规则>

使用规则:

(#PCDATA):指示元素的主体内容只能是普通的文本.(ParsedCharacterData)

EMPTY:指示元素的不能有主体内容

ANY:用于指示元素的主体内容为任意类型

(子元素):指示元素中包含的子元素

如果子元素用逗号分开,说明必须按照声明顺序去编写XML文档

如果子元素用“|”分开,说明任选其一。

+*、?来表示元素出现的次数

5.2定义元素的属性(attribute)

语法:<!ATTLIST哪个元素的属性

属性1属性值类型设置说明

属性2属性值类型设置说明>

属性值类型:

CDATA:说明该属性的取值为一个普通文本

ENUMERATED(DTD没有此关键字)

语法:<!ATTLIST元素名称(1|2)"1">

ID:属性的取值不能重复

设置说明:

#required:表示该属性必须出现

#IMPLIED:属性可有可无

#FIXED:表示属性的取值为一个固定值语法:#FIXED"固定值"

直接值:表示属性的取值为该默认值

5.2定义实体

关键字ENTITY

实体的定义分为引用实体和参数实体

引用实体:

作用:在DTD中定义,在XML中使用

语法:<!ENTITY实体名称"实体内容">

XML中使用:&实体名称;

参数实体:

作用:在DTD中定义,在DTD中使用

语法:<!ENTITY%实体名称"实体内容">

DTD中使用:%实体名称;

五、XML解析方式概述

1、常用XML的解析方式:DOMSAX

DOM:DocumentObjectModel是W3C推荐使用的解析方式

SAX:SimpleAPIforXML。非官方标准。

2、常用解析开发包:

JAXP:SUN推出的实现,能进行DOMSAX方式解析

Dom4J

JDom等

六、JAXP进行DOM解析

JAXP的API都在JavaSE中。

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

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

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

XML编程(CRUD)

DOM解析:

获得JAXP中的DOM解析器:

l调用DocumentBuilderFactory.newInstance()方法得到创建DOM解析器的工厂。

l调用工厂对象的newDocumentBuilder方法得到DOM解析器对象。

l调用DOM解析器对象的parse()方法解析XML文档,得到代表整个文档的Document对象,进而可以利用DOM特性对整个XML文档进行操作了。

DOM模型(documentobjectmodel)

DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)

dom中,节点之间关系如下:

位于一个节点之上的节点是该节点的父节点(parent)

一个节点之下的节点是该节点的子节点(children

同一层次,具有相同父节点的节点是兄弟节点(sibling

一个节点的下一个层次的节点集合是节点后代(descendant)

父、祖父节点及所有位于节点上面的,都是节点的祖先(ancestor)

Node对象

Node对象提供了一系列常量来代表结点的类型,当开发人员获得某个Node类型后,就可以把Node节点转换成相应的节点对象(Node的子类对象),以便于调用其特有的方法。(查看API文档)

Node对象提供了相应的方法去获得它的父结点或子结点。编程人员通过这些方法就可以读取整个XML文档的内容、或添加修改删除XML文档的内容了。

更新XML文档

avax.xml.transform包中的Transformer类用于把代表XML文件Document对象转换为某种格式后进行输出,例如把xml文件应用样式表后转成一个html文档。利用这个对象,当然也可以把Document对象又重新写入到一个XML文件中。

Transformer类通过transform方法完成转换操作,该方法接收一个源和一个目的地。我们可以通过:

javax.xml.transform.dom.DOMSource类来关联要转换的document对象,

javax.xml.transform.stream.StreamResult对象来表示数据的目的地。

Transformer对象通过TransformerFactory获得。

实例代码:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="UTF-8"standalone="no"?>
  2. <!DOCTYPEchina[
  3. <!ELEMENTchina(itheima,itcast)>
  4. <!ELEMENTitheima(teacher+)>
  5. <!ELEMENTitcast(teacher+)>
  6. <!ELEMENTteacher(name,age,teach)>
  7. <!ELEMENTname(#PCDATA)>
  8. <!ELEMENTage(#PCDATA)>
  9. <!ELEMENTteach(#PCDATA)>
  10. <!ATTLISTteacheridID#required>
  11. ]>
  12. <china>
  13. <itheima>
  14. <teacherid="a1">
  15. <name>张孝祥</name>
  16. <age>38</age>
  17. <teach>javaee</teach>
  18. </teacher>
  19. <teacherid="a2">
  20. <name>方立勋</name>
  21. <age>36</age>
  22. <teach>javaweb</teach>
  23. <teacherid="a3">
  24. <name>付东</name>
  25. <age>34</age>
  26. <teach>andriod</teach>
  27. <!--验证成功-->
  28. </itheima>
  29. <itcast>
  30. <teacherid="b1">
  31. <name>张磊</name>
  32. <age>34</age>
  33. <teach>web基础</teach>
  34. </teacher>
  35. <teacherid="b2">
  36. <name>韩顺平</name>
  37. <age>39</age>
  38. <teach>linux</teach>
  39. <teacherid="b3">
  40. <name>张昭廷</name>
  41. <teach>javaweb</teach>
  42. </itcast>
  43. </china>


-------------------------------------------------

[java] copy
    packagecn.itheima.dom;
  1. importjavax.xml.parsers.DocumentBuilder;
  2. importjavax.xml.parsers.DocumentBuilderFactory;
  3. importjavax.xml.transform.Transformer;
  4. importjavax.xml.transform.TransformerFactory;
  5. importjavax.xml.transform.dom.DOMSource;
  6. importjavax.xml.transform.stream.StreamResult;
  7. importorg.junit.Assert;
  8. importorg.junit.Test;
  9. importorg.w3c.dom.Document;
  10. importorg.w3c.dom.Element;
  11. importorg.w3c.dom.Node;
  12. importorg.w3c.dom.NodeList;
  13. publicclassDOMTeast{
  14. /**
  15. *@paramargs
  16. *@throwsException
  17. */
  18. publicstaticvoidmain(String[]args)throwsException{
  19. //TODOAuto-generatedmethodstub
  20. //test1();
  21. //readAtt();
  22. //addNode();
  23. //deleteNode();
  24. //binaLiNode();
  25. //refreshNode();
  26. }
  27. //6.打印所有元素节点的名称.遍历
  28. publicstaticvoidbinaLiNode()throwsException{
  29. Documentdocument=getDocument();
  30. listNode(document);
  31. privatestaticvoidlistNode(Nodenode){
  32. //TODOAuto-generatedmethodstub
  33. if(node.getNodeType()==Node.ELEMENT_NODE){
  34. System.out.println(node.getNodeName());
  35. }
  36. NodeListnl=node.getChildNodes();
  37. for(inti=0;i<nl.getLength();i++){
  38. Nodenode1=nl.item(i);
  39. listNode(node1);
  40. //5.更新节点:<teach>javaee</teach>
  41. publicstaticvoidrefreshNode()throwsException{
  42. Documentdocument=getDocument();
  43. NodeListnodeList=document.getElementsByTagName("teach");
  44. /*for(inti=0;i<nodeList.getLength();i++){
  45. Nodenode=nodeList.item(i);
  46. if(node.getTextContent().equals("javaee")){
  47. node.getParentNode().setTextContent("android");
  48. }
  49. }*/
  50. nodeList.item(0).getParentNode().setTextContent("android");
  51. refreshXML(document);
  52. //4.删除节点:<teach>javaee</teach>
  53. @Test
  54. publicstaticvoiddeleteNode()throwsException{
  55. NodeListnodeList=document.getElementsByTagName("teach");
  56. for(inti=0;i<nodeList.getLength();i++){
  57. Nodenode=nodeList.item(i);
  58. if(node.getTextContent().equals("javaee")){
  59. node.getParentNode().removeChild(node);
  60. //3.添加节点:<售价>59.00</售价>
  61. publicstaticvoidaddNode()throwsException{
  62. //添加吴超标签题,然后设置属性id为5;
  63. Elementelement=document.createElement("teacher");
  64. //element.setAttribute("id","5");
  65. element.setTextContent("test");
  66. Nodeitem=document.getElementsByTagName("itheima").item(0);
  67. item.appendChild(element);
  68. refreshXML(document);
  69. //2.读取属性值,这个思路没问题,测试结果不行!!!--
  70. publicstaticvoidreadAtt()throwsException{
  71. NodeListtagName=document.getElementsByTagName("name");
  72. /*for(inti=0;i<tagName.getLength();i++){
  73. Elementitem=(Element)tagName.item(i);
  74. //测试用
  75. //System.out.println(item.getLocalName());
  76. Objectatt=item.getAttribute("color");
  77. System.out.println(att);
  78. Assert.assertEquals("red",att);
  79. }*/
  80. Elementitem=(Element)tagName.item(0);
  81. Objectatt=item.getAttribute("color");
  82. System.out.println(att);
  83. Assert.assertEquals("red",226); color:inherit; line-height:18px"> //*1.读取节点的文本内容
  84. publicstaticvoidtest1()throwsException{
  85. NodeListtagName=document.getElementsByTagName("teach");
  86. for(intx=0;x<tagName.getLength();x++){
  87. Nodenode=tagName.item(x);
  88. //getTextContent获取标签标签
  89. Stringstring=node.getTextContent();
  90. System.out.println(string);
  91. /*javaee
  92. javaweb
  93. andriod
  94. web基础
  95. linux
  96. javaweb*/
  97. //-----------------------------------------
  98. publicstaticDocumentgetDocument()throwsException{
  99. //首先拿到一个documentbuilderfactory对象.
  100. DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
  101. //通过factory对象拿到一个documentbuilder对象.
  102. DocumentBuilderbuilder=factory.newDocumentBuilder();
  103. //通过builder的parse方法获得一个document对象.
  104. Documentdocument=builder.parse("src\\itheima.xml");
  105. returndocument;
  106. publicstaticvoidrefreshXML(Documentdoc)throwsException{
  107. //如何更新xml文件从内存中到xml文档.
  108. //首先要拿到一个工厂
  109. TransformerFactoryfactory=TransformerFactory.newInstance();
  110. //拿到工厂之后在获得一个transformer
  111. Transformertransformer=factory.newTransformer();
  112. transformer.transform(newDOMSource(doc),newStreamResult("src/itheima.xml"));
  113. }


七、JAXP进行SAX解析

在使用DOM解析XML文档时,需要读取整个XML文档,在内存中构架代表整个DOM树的Doucment对象,从而再对XML文档进行操作。此种情况下,如果XML文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出。(java中虚拟机默认开辟的内存空间)outofmemort(OOM)

SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才对文档进行操作。

SAX采用事件处理的方式解析XML文件,利用SAX解析XML文档,涉及两个部分:解析器和事件处理器:

解析器可以使用JAXPAPI创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。

解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。

事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。

SAX方式解析XML文档

使用SAXParserFactory创建SAX解析工厂

SAXParserFactoryspf=SAXParserFactory.newInstance();

通过SAX解析工厂得到解析器对象

SAXParsersp=spf.newSAXParser();

通过解析器对象得到一个XML的读取器

XMLReaderxmlReader=sp.getXMLReader();

设置读取器的事件处理器

xmlReader.setContentHandler(newBookParserHandler());

解析xml文件

xmlReader.parse("book.xml");

******八.Pull解析器

pull解析器是一个第三方的开源api,其解析原理与sax解析原理很相像,都是采用事件驱动的方式.

不同点:pull解析器在每次读取到一段数据之后,需要程序员手动的调用next()方法,将当前解析到的这一行的"指针"移到下一行.

copy
    <?xmlversion="1.0"encoding="UTF-8"standalone="no"?><书架>
  1. <书出版社="北京传智">
  2. <书名>Java就业培训教程</书名>
  3. <作者>张孝祥</作者>
  4. <售价>59.00元</售价>
  5. </>
  6. <书出版社="上海传智">
  7. <书名>JavaScript网页开发</书名>
  8. <作者>张孝祥</作者>
  9. <售价>28.00元</售价>
  10. </>
  11. </书架>


------------------------------------------------------------------------------

copy
    publicstaticList<Book>getBooks()throwsException{
  1. List<Book>list=newArrayList<Book>();
  2. XmlPullParserFactoryfactory=XmlPullParserFactory.newInstance();
  3. XmlPullParserparser=factory.newPullParser();
  4. parser.setInput(newFileInputStream("src/book.xml"),"UTF-8");
  5. inteventType=parser.getEventType();
  6. Bookbook=null;
  7. while(eventType!=XmlPullParser.END_DOCUMENT){
  8. switch(eventType){
  9. caseXmlPullParser.START_TAG:
  10. if("书".equals(parser.getName())){
  11. Stringarea=parser.getAttributeValue(0);
  12. book=newBook();
  13. book.setArea(area);
  14. if("书名".equals(parser.getName())){
  15. //用于获取书名开始后紧挨着的文本内容
  16. Stringbookname=parser.nextText();
  17. book.setBookaname(bookname);
  18. if("作者".equals(parser.getName())){
  19. Stringauthor=parser.nextText();
  20. book.setAuthor(author);
  21. break;
  22. caseXmlPullParser.END_TAG:
  23. list.add(book);
  24. book=null;
  25. default:
  26. break;
  27. eventType=parser.next();
  28. returnlist;
  29. }


开始解析文档
area = 出版社,author = 张孝祥,bookaname = Java就业培训教程
area = 出版社,bookaname = JavaScript网页开发开始解析文档
area = 出版社,bookaname = JavaScript网页开发

九、Dom4J简介

Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4jAPI相对要复杂一些,但它提供了比JDOM更好的灵活性。

Dom4j是一个非常优秀的JavaXMLAPI,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate包括sun公司自己的JAXM也用了Dom4j

使用Dom4j开发,需下载dom4j相应的jar文件

DOM4j中,获得Document对象的方式有三种:

1.读取XML文件,获得document对象

SAXReaderreader=newSAXReader();
Documentdocument=reader.read(newFile("input.xml"));

2.解析XML形式的文本,得到document对象.

Stringtext="<members></members>";
Documentdocument=DocumentHelper.parseText(text);

3.主动创建document对象.

Documentdocument=DocumentHelper.createDocument();
//创建根节点

Elementroot=document.addElement("members");

节点对象

1.获取文档的根节点.

Elementroot=document.getRootElement();

2.取得某个节点的子节点.

Elementelement=node.element(“书名");

3.取得节点的文字

Stringtext=node.getText();

4.取得某节点下所有名为“member”的子节点,并进行遍历.
Listnodes=rootElm.elements("member");

for(Iteratorit=nodes.iterator();it.hasNext();){
Elementelm=(Element)it.next();
//dosomething
}

5.对某节点下的所有子节点进行遍历.
for(Iteratorit=root.elementIterator();it.hasNext();){
Elementelement=(Element)it.next();
//dosomething
}

6.在某节点下添加子节点.
ElementageElm=newMemberElm.addElement("age");

将文档写入XML文件.

1.文档中全为英文,不设置编码,直接写入的形式.
XMLWriterwriter=newXMLWriter(newFileWriter("output.xml"));
writer.write(document);
writer.close();

2.文档中含有中文,设置编码格式写入的形式.
OutputFormatformat=OutputFormat.createPrettyPrint();
//指定XML编码

format.setEncoding("GBK");
XMLWriterwriter=newXMLWriter(newFileOutputStream("output.xml"),format);
writer.write(document);
writer.close();

字符串与XML的转换

1.将字符串转化为XML

Stringtext="<members><member>sitinspring</member></members>";
Documentdocument=DocumentHelper.parseText(text);

2.将文档或节点的XML转化为字符串.

SAXReaderreader=newSAXReader();
Documentdocument=reader.read(newFile("input.xml"));
Elementroot=document.getRootElement();


StringdocXmlText=document.asXML();

StringrootXmlText=root.asXML();
ElementmemberElm=root.element("member");
StringmemberXmlText=memberElm.asXML();

*****十、XML约束之schema(看懂即可)

XMLSchema文件自身就是一个XML文件,但它的扩展名通常为.xsd

一个XMLSchema文档通常称之为模式文档(约束文档),遵循这个文档书写的xml文件称之为实例文档。

XML文件一样,一个XMLSchema文档也必须有一个根结点,但这个根结点的名称Schema

编写了一个XMLSchema约束文档后,通常需要把这个文件中声明的元素绑定到一个URI地址上,在XMLSchema技术中有一个专业术语来描述这个过程,即把XMLSchema文档声明的元素绑定到一个名称空间上,以后XML文件就可以通过这个URI(即名称空间)来告诉解析引擎,xml文档中编写的元素来自哪里,被谁约束。

重点:能够根据schema写出xml文档.

难点:如何去引用一个已经写好的schema文档.

名称空间的概念

XMLSchema中,每个约束模式文档都可以被赋以一个唯一的名称空间,名称空间用一个唯一的URIUniformResourceIdentifier,统一资源标识符)表示。在Xml文件中书写标签时,可以通过名称空间声明(xmlns),来声明当前编写的标签来自哪个Schema约束文档。如:

<itcast:书架xmlns:itcast=http://www.itcast.cn>

<itcast:书>……</itcast:>

</itcast:书架>

此处使用itcast来指向声明的名称,以便于后面对名称空间的引用。

注意:名称空间的名字语法容易让人混淆,尽管以http://开始,那个URL并不指向一个包含模式定义的文件。事实上,这个URLhttp://www.itcast.cn根本没有指向任何文件,只是一个分配的名字。

使用名称空间引入Schema

为了在一个XML文档中声明它所遵循的Schema文件的具体位置,通常需要在Xml文档中的根结点中使用schemaLocation属性来指定,例如:

<itcast:书架xmlns:itcast="http://www.itcast.cn"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation=“http://www.itcast.cnbook.xsd">

schemaLocation此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的XMLschema的位置,两者之间用空格分隔。

注意,在使用schemaLocation属性时,也需要指定该属性来自哪里。

使用默认名称空间

基本格式:

xmlns="URI"

举例:

<书架xmlns="http://www.it315.org/xmlbook/schema"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation=“http://www.itcast.cnbook.xsd">

<书>

<书名>JavaScript网页开发</书名>

<作者>张孝祥</作者>

<售价>28.00</售价>

</书>

<书架>

使用名称空间引入多个XMLSchema文档

文件清单:xmlbook.xml

<?xmlversion="1.0"encoding="UTF-8"?>

<书架xmlns="http://www.it315.org/xmlbook/schema"

xmlns:demo="http://www.it315.org/demo/schema"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.it315.org/xmlbook/schemahttp://www.it315.org/xmlbook.xsd

http://www.it315.org/demo/schemahttp://www.it315.org/demo.xsd">

<书>

<书名>JavaScript网页开发</书名>

<作者>张孝祥</作者>

<售价demo:币种=”人民币”>28.00</售价>

</书>

</书架>

不使用名称空间引入XMLSchema文档

文件清单:xmlbook.xml

<?xmlversion="1.0"encoding="UTF-8"?>

<书架xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:noNamespaceSchemaLocation="xmlbook.xsd">

<书>

<书名>JavaScript网页开发</书名>

<作者>张孝祥</作者>

<售价>28.00</售价>

</书>

</书架>

XMLSchema文档中声明名称空间

<xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema"

targetNamespace="http://www.itcast.cn"

elementFormDefault="qualified">

<xs:schema>

targetNamespace元素用于指定schema文档中声明的元素属于哪个名称空间。

elementFormDefault元素用于指定,该schema文档中声明的根元素及其所有子元素都属于targetNamespace所指定的名称空间。

作业

a.参看w3c文档

b.xml一般的应用场景?

c.xml的约束结束有几种?分别是什么技术?

d.简述dom解析的原理?dom解析与sax解析的各自的优点以及缺点是什么?

e.在一个java项目中,如何导入第三方开源jar?

f.参看dom4jquickstart(快速入门)

g.简述pull解析器的原理?参看pull解析器的api文档.

h.schema名称空间的是什么?

i.一个schema约束文档的根元素必须要是什么?

a)思考:你要写的xml文档的根元素是什么?

schema文档中的第一个element出现的地方.

<xs:elementname='书架'>

b)思考:你写的根元素来自于哪个名称空间.

schema文档的targetNamespace="http://www.itcast.cn".

<itcast:书架xmlns:itcast="http://www.itcast.cn">

c)思考:名称空间与这个schema约束的对应关系.

xsi:schemaLocation="{namespace}{location}"

d)<itcast:书架xmlns:itcast="http://www.itcast.cn"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.itcast.cnbook.xsd">

XSD是指XML结构定义(XMLSchemasDefinition)
XMLSchemaDTD的替代品。XMLSchema语言也就是XSD
XMLSchema描述了XML文档的结构。可以用一个指定的XMLSchema来验证某个XML文档,以检查该XML文档是否符合其要求。文档设计者可以通过XMLSchema指定一个XML文档所允许的结构和内容,并可据此检查一个XML文档是否是有效的。XMLSchema本身是一个XML文档,它符合XML语法结构。可以用通用的XML解析器解析它。
一个XMLSchema会定义:文档中出现的元素、文档中出现的属性、子元素、子元素的数量、子元素的顺序、元素是否为空、元素和属性的数据类型、元素或属性的默认和固定值。
XSDDTD替代者的原因,一是据将来的条件可扩展,二是比DTD丰富和有用,三是用XML书写,四是支持数据类型,五是支持命名空间。
XSD文件的后缀名为.xsd
XMLSchema的优点:
1)XMLSchema基于XML,没有专门的语法
2)XML可以象其他XML文件一样解析和处理
3)XMLSchema支持一系列的数据类型(intfloatBooleandate)
4)XMLSchema提供可扩充的数据模型。
5)XMLSchema支持综合命名空间
6)XMLSchema支持属性组。

原文链接:https://www.f2er.com/xml/298549.html

猜你在找的XML相关文章