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"))); //将内存中的内容写到文件中
}
}