XML解析技术概述
XML解析方式分为两种:dom和sax
dom:(Document Object Model)W3C组织推荐的解析XML的一种方式。
sax:(SImple API forXML)几乎所有XML都支持它
- dom和sax解析的不同:
dom先把整个文档放到内存中然后生成一个dom对象。文档内的每个节点也会变成一个对象,变成Element,Text,attribute对象。然后在建立对象间关系。
@H_403_18@
优点:增加改查比较容易。可以通过调用对象方法来计算。
缺点:内存消耗大
sax从上往下读,依次处理
优点:内存消耗小
缺点:不适合增改。
XML解析开发包:
Jaxp(sun)、Jdom,dom4j JAXP是J2SE的一部分,javax.xml org.w3c.dom org.xml.sax及其子包组成 javax.xml.parsers包中,定义了几个工厂类,调用工厂类可以得到dom或者sax解析器。从而实现xml文档的解析- 使用jaxp进行dom解析:
DocumentBuilderFactory用于创建DOM模式的解析器对象。
例子
//1.创建工厂
DocumentBuilderfactory factory = DocumentBuilderFactory.newInstance();
//2.得到dom解析器
DocumentBuilder builder = factory.newDocumentBuilder();
//3.解析xml文档,得到代表文档的Document
Document document = builder.parse("src/book.xml");
- Document对象的操作:
public void read(){
DocumentBuilderfactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");
NodeList book = document.getElementsByTagName("书名");//Node是ELement,attribute,text的超类
Node node = list.item(1);
String content = node.getTextContent();
System.out.println(content);
}
添加xml元素及更新XML文档
javax.xml.transform包中的Transformer类用于把代表xml文件的Document对象转换为某种格式后进行输出,例如把xml文件应用样式表后转成一个html文档。利用这个对象,当然也可以把Document对象重新写入到一个xml文件中。
Transformer类通过transform方法完成转换操作,该方法接受一个源和一个目的地。我们可以通过:
javax.xml.transform.dom.DomSource类来关联要转换的document对象
@H_403_18@
用javax.xml.transform.stream.StreamResult对象来表示数据的目的地。Transform对象通过TransformFactory获得。
public void add() throws Exception{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Doument document = builder.parse("src/book.xml"); //创建节点 Element price = document.createElement("售价"); price.setTextContent(textContent) //得到参考节点 Element refNode = (Element) document.getElementByTagName("售价").item(0); //把得到插入的父节点 Element book = (Element) document.getElementByTagNAme(“书”).item(0); //往book节点的指定位置插入子节点 book.insertBefore(price,refNode); /* //创建的节点挂到第一本书上 Element book = (Element) document.getElementByTagName("书").item(0); book.appendChild(price); */ //把更新后的内存写回到xml文档 TransformerFactory tffactory = TransformerFactory.newInstance(); Transformer tf = tffactory.newTransformer(); tf.transform(new DOMsource(document),new StreamRsult(new FileOutputStream("src/book.xml"))) }
添加属性
public void addAttr() throws Exception{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); Element booknames = (Element) document.getElementSByTageName("书名").item(0); bookname.setAttribute("name","XXXXX"); TransformerFactory tffactory = TransformerFactory.newInstance(); Transformer tf = tffactory.newTransformer(); tf.transform(new DOMsource(document),new StreamRsult(new FileOutputStream("src/book.xml"))) }
删除售价
public void delete() throw Exception{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); //得到要删除的节点 Element e = (Element) document.getElementsByTagName("售价").item(0); //得到要删除的节点的父节点 ELement book = (Element) document.getElementsByTagName("书").item(0); book.removeChild(e); }
public void delete() throw Exception{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); //得到要删除的节点 Element e = (Element) document.getElementsByTagName("售价").item(0); e.getParentNode().remove(e); }
更新节点
public void update() throw Exception{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); //得到要删除的节点 Element e = (Element) document.getElementsByTagName("售价").item(0); e.setTextContent("109元"); }