javaWEb-day01(XML编程)

来源:互联网 发布:天刀捏脸数据女御姐脸 编辑:程序博客网 时间:2024/05/19 03:28

XML编程


就是:写java程序操作XML文档。增删改查(CRUD)create read update delete



XML解析方式


分为两种:dom和sax。操作XML文档,如果你想增删改,请用dom。如果你想查找,请用sax



dom


(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。




由于用dom解析方法解析,需要把所有节点都变成对象进内存,所以如果这个XML文件很大,这时java虚拟机就会跑不起来。


我们来看看java虚拟机的默认内存多大64M








把java虚拟机内存改成80M:




这样就可以运行60M的程序了。因为java虚拟机它本身也占一定的内存。



等20秒,这个程序运行完毕,刚才给java虚拟机分配的内存就又还给电脑了。


在控制台这么改:




sax

 

(Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。

读取一行,解析一行。

特点:对内存消耗小,效率特别高。

但是sax方式不适合用,只适合用来在XML中查找数据。






XML解析器


支持这两种解析方式的一些解析器:

Crimson(sun)完败、Xerces(ibm)  都贡献给了apache。

Aelfred2(dom4j)


由于程序员自己写程序去调用这些解析器比较困难。

sun公司为了我们方便的操作XML文档,又写了一些API对解析器进行了包装。



XML解析开发包


Jaxp(sun)这个API在1.4以前调用的是Crimson(sun)解析器,在1.5以后调用的是Xerces(ibm)解析器。

Jdom 的开发人员有了分裂,

dom4j(以前没有)分裂出来的开发人员又开发出了dom4j。完胜。使用的解析器是Aelfred2(dom4j)。


虽然dom4j完胜Jaxp(sun),但是我们还是要学Jaxp(sun),因为它是标准,现在不行,不代表将来不行。



JAXP


JAXP 开发包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包组成.
javax.xml.parsers 包中,定义了几个工厂类,程序员调用这些工厂类,可以得到对xml文档进行解析的 DOM 或 SAX 的解析器对象。



使用JAXP进行DOM解析


javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法 ,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。

       

       获得JAXP中的DOM解析器:

  1. 调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。
  2. 调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。
  3. 调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。



javax.xml.parsers 
DocumentBuilderFactory

public abstract class DocumentBuilderFactory
构造方法摘要protectedDocumentBuilderFactory() 
          用于阻止实例化的受保护构造方法。

方法摘要static DocumentBuilderFactorynewInstance() 
          获取 DocumentBuilderFactory 的新实例。abstract  DocumentBuildernewDocumentBuilder() 
          使用当前配置的参数创建一个新的 DocumentBuilder 实例。



javax.xml.parsers 
DocumentBuilder

public abstract class DocumentBuilder

 Documentparse(File f) 
          将给定文件的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象。abstract  Documentparse(InputSource is) 
          将给定输入源的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象。 Documentparse(InputStream is) 
          将给定 InputStream 的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象。 Documentparse(InputStream is, String systemId) 
          将给定 InputStream 的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象。 Documentparse(String uri) 
          将给定 URI 的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象。


org.w3c.dom 
接口 Document

public interface Document
extends Node
 ElementgetElementById(String elementId) 
          返回具有带给定值的 ID 属性的 Element NodeListgetElementsByTagName(String tagname) 
          按文档顺序返回包含在文档中且具有给定标记名称的所有 Element 的 NodeList


org.w3c.dom 
接口 NodeList

public interface NodeList

方法摘要 intgetLength() 
          列表中的节点数。 Nodeitem(int index) 
          返回集合中的第 index 个项。


org.w3c.dom 
接口 Node

public interface Node

 StringgetTextContent() 
          此属性返回此节点及其后代的文本内容。



DOM模型(document object model)
  1. DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。
  2. 在dom中,节点之间关系如下:
  • 位于一个节点之上的节点是该节点的父节点(parent)
  • 一个节点之下的节点是该节点的子节点(children)
  • 同一层次,具有相同父节点的节点是兄弟节点(sibling)
  • 一个节点的下一个层次的节点集合是节点后代(descendant)
  • 父、祖父节点及所有位于节点上面的,都是节点的祖先(ancestor) 

Node对象

  1. Node对象提供了一系列常量来代表结点的类型,当开发人员获得某个Node类型后,就可以把Node节点转换成相应的节点对象(Node的子类对象),以便于调用其特有的方法。(查看API文档) 
  2. Node对象提供了相应的方法去获得它的父结点或子结点。编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容了。



查看第一个售价标签的值:

package cn.itcast.jaxp;import java.io.File;import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;public class Demo1 {public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {//1.创建解析器工厂DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//2.创建解析器DocumentBuilder builder = factory.newDocumentBuilder();//3.获得指定XML文档的document对象Document document = builder.parse(new File("src/book.xml"));read(document);}//得到售价标签的内容public static void read(Document document){NodeList list = document.getElementsByTagName("售价");Node node = list.item(0);String value = node.getTextContent();System.out.println(value);}}



更新XML文档

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

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

  • javax.xml.transform.dom.DOMSource类来关联要转换的document对象, 
  • 用javax.xml.transform.stream.StreamResult 对象来表示数据的目的地。
3. Transformer对象通过TransformerFactory获得。


javax.xml.transform 
TransformerFactory

static TransformerFactorynewInstance() 
          获取 TransformerFactory 的新实例。abstract  TransformernewTransformer() 
          创建执行从 Source 到 Result 的复制的新 Transformer


javax.xml.transform 
Transformer

abstract  voidtransform(Source xmlSource, Result outputTarget) 
          将 XML Source 转换为 Result


javax.xml.transform.dom 
DOMSource

public class DOMSource
implements Source

构造方法摘要DOMSource(Node n)
              创建带有 DOM 节点的新输入源。



javax.xml.transform.stream 
StreamResult

public class StreamResult
implements Result

构造方法摘要StreamResult(File f) 
          从 File 构造 StreamResult 。


org.w3c.dom 
接口 Element

public interface Element
extends Node

 voidsetAttribute(String name, String value) 
          添加一个新属性。 voidremoveAttribute(String name) 
          通过名称移除一个属性。



org.w3c.dom 
接口 Node

字段摘要static shortATTRIBUTE_NODE 
          该节点为 Attrstatic shortCDATA_SECTION_NODE 
          该节点为 CDATASectionstatic shortCOMMENT_NODE 
          该节点为 Commentstatic shortDOCUMENT_FRAGMENT_NODE 
          该节点为 DocumentFragmentstatic shortDOCUMENT_NODE 
          该节点为 Documentstatic shortDOCUMENT_POSITION_CONTAINED_BY 
          引用节点包含该节点。static shortDOCUMENT_POSITION_CONTAINS 
          该节点包含引用节点。static shortDOCUMENT_POSITION_DISCONNECTED 
          两个节点断开连接。static shortDOCUMENT_POSITION_FOLLOWING 
          该节点在引用节点之后。static shortDOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC 
          对前后位置的确定是特定于实现的。static shortDOCUMENT_POSITION_PRECEDING 
          第二个节点在引用节点之前。static shortDOCUMENT_TYPE_NODE 
          该节点为 DocumentTypestatic shortELEMENT_NODE 
          该节点为 Elementstatic shortENTITY_NODE 
          该节点为 Entitystatic shortENTITY_REFERENCE_NODE 
          该节点为 EntityReferencestatic shortNOTATION_NODE 
          该节点为 Notationstatic shortPROCESSING_INSTRUCTION_NODE 
          该节点为 ProcessingInstructionstatic shortTEXT_NODE 
          该节点为 Text 节点。方法摘要

 shortgetNodeType() 
          表示基础对象的类型的节点,如上所述。


DOM解析编程
  1. 遍历所有节点
  2. 查找某一个节点
  3. 删除结点
  4. 更新结点
  5. 添加节点

package cn.itcast.jaxp;import java.io.File;import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.junit.Test;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;public class Demo1 {public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {//1.创建解析器工厂DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//2.创建解析器DocumentBuilder builder = factory.newDocumentBuilder();//3.获得指定XML文档的document对象Document document = builder.parse(new File("src/book.xml"));//遍历list(document);}//得到第一个售价标签的内容@Testpublic void read() throws Exception{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.parse(new File("src/book.xml"));NodeList list = document.getElementsByTagName("售价");Node node = list.item(0);String value = node.getTextContent();System.out.println(value);}//修改节点的值:<售价>39.00元</售价>改为109@Testpublic void update() throws Exception{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.parse(new File("src/book.xml"));Node node = document.getElementsByTagName("售价").item(0);node.setTextContent("109元");TransformerFactory factory1 = TransformerFactory.newInstance();Transformer transformer = factory1.newTransformer();transformer.transform(new DOMSource(document), new StreamResult(new File("src/book.xml")));}//向指定节点中增加孩子节点:增加内部售价59元@Testpublic void add() throws Exception{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.parse(new File("src/book.xml"));Node node = document.createElement("售价");node.setTextContent("59元");Node book = document.getElementsByTagName("书").item(0);book.appendChild(node);TransformerFactory factory1 = TransformerFactory.newInstance();Transformer transformer = factory1.newTransformer();transformer.transform(new DOMSource(document), new StreamResult(new File("src/book.xml")));}//向指定位置上插入节点:在<书名>节点前添加<售价>39元</售价>@Testpublic void insert() throws Exception{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.parse(new File("src/book.xml"));Node node = document.createElement("售价");node.setTextContent("39元");Node book = document.getElementsByTagName("书").item(0);book.insertBefore(node, document.getElementsByTagName("书名").item(0));TransformerFactory factory1 = TransformerFactory.newInstance();Transformer transformer = factory1.newTransformer();transformer.transform(new DOMSource(document), new StreamResult(new File("src/book.xml")));}//删除指定节点:删除<售价>59元</售价>@Testpublic void delete() throws Exception{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.parse(new File("src/book.xml"));Node node = document.getElementsByTagName("售价").item(2);Node parent = node.getParentNode();parent.removeChild(node);TransformerFactory factory1 = TransformerFactory.newInstance();Transformer transformer = factory1.newTransformer();transformer.transform(new DOMSource(document), new StreamResult(new File("src/book.xml")));}//操作XML文档属性:将第一个<书 name="xxxxxx"></书>节点的name属性值改为yyyyyy@Testpublic void updateAttribute() throws Exception{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.parse(new File("src/book.xml"));Node book = document.getElementsByTagName("书").item(0);Element element = null;if(book.getNodeType() == Node.ELEMENT_NODE){element = (Element)book;}element.setAttribute("name", "yyyyy");element.setAttribute("password", "123456");element.removeAttribute("password");TransformerFactory factory1 = TransformerFactory.newInstance();Transformer transformer = factory1.newTransformer();transformer.transform(new DOMSource(document), new StreamResult(new File("src/book.xml")));}//遍历public static void list(Node node){if(node.getNodeType() == Node.ELEMENT_NODE){System.out.println(node.getNodeName());}NodeList list = node.getChildNodes();for(int x=0; x<list.getLength(); x++){list(list.item(x));}}}













使用JAXP进行SAX解析









dom4j




使用 dom4j 进行 DOM 解析




使用 dom4j 进行 SAX 解析





0 0
原创粉丝点击