xml进一步学习

来源:互联网 发布:婚礼logo在线制作软件 编辑:程序博客网 时间:2024/04/29 06:50

  DOM模型(document object model)

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

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

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

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

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

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

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

  

  更新XML文档

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

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

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

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

  Transformer对象通过TransformerFactory获得。

  SAX解析

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

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

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

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

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

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


  SAX方式解析XML文档

  使用SAXParserFactory创建SAX解析工厂

  SAXParserFactory spf = SAXParserFactory.newInstance();

  通过SAX解析工厂得到解析器对象 SAXParser sp = spf.newSAXParser();

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

  XMLReader xmlReader = sp.getXMLReader();

  设置读取器的事件处理器 xmlReader.setContentHandler(new BookParserHandler());

  解析xml文件 xmlReader.parse("book.xml");


  

  Dom4j在指定位置插入节点

  1.得到插入位置的节点列表(list)

  2.调用list.add(index,elemnent),由index决定element的插入位置。

  Element元素可以通过DocumentHelper对象得到。示例代码:

  Element aaa = DocumentHelper.createElement("aaa");

  aaa.setText("aaa");

  List list = root.element("书").elements();

  list.add(1, aaa);

  //更新document

今天作业:

1、完成对节点属性的添加、删除的操作

1.1、添加属性

package dom;


import java.io.File;


import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;


import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


public class DomTest3 {


/**
* @param args
*/
public static void main(String[] args) throws Exception{

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// 创建解析器工厂
DocumentBuilder builder = factory.newDocumentBuilder();// 创建解析器
Document doc = builder.parse(new File("src/shuiguo.xml")); // 得到文档对象

createElement(doc);
}


public static void createElement(Document doc)throws Exception {
Node banana=doc.getElementsByTagName("香蕉").item(0);

Element element=(Element)banana;


element.setAttribute("id", "3");


TransformerFactory factory=TransformerFactory.newInstance();     //创建类型转换工厂
Transformer former=factory.newTransformer();     //创建转换器
former.transform(new DOMSource(doc), new StreamResult(new File("src/shuiguo.xml")));   //将内存中的内容写到文件中
}


}

1.2、删除属性

package dom;


import java.io.File;


import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;


import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;


public class DomTest4 {


/**
* @param args
*/
public static void main(String[] args) throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// 创建解析器工厂
DocumentBuilder builder = factory.newDocumentBuilder();// 创建解析器
Document doc = builder.parse(new File("src/shuiguo.xml")); // 得到文档对象

removeElement(doc);
}


public static void removeElement(Document doc) throws Exception{
Node banana=doc.getElementsByTagName("香蕉").item(0);

Element element=(Element)banana;

element.removeAttribute("id");

TransformerFactory factory=TransformerFactory.newInstance();     //创建类型转换工厂
Transformer former=factory.newTransformer();     //创建转换器
former.transform(new DOMSource(doc), new StreamResult(new File("src/shuiguo.xml")));   //将内存中的内容写到文件中
}



}




原创粉丝点击