XML解析技术概述
XML解析方式分为两种:dom和sax
dom:(Document Object Model)W3C组织推荐的解析XML的一种方式。
sax:(SImple API forXML)几乎所有XML都支持它
- dom和sax解析的不同:
dom先把整个文档放到内存中然后生成一个dom对象。文档内的每个节点也会变成一个对象,变成Element,Text,attribute对象。然后在建立对象间关系。
优点:增加改查比较容易。可以通过调用对象方法来计算。
缺点:内存消耗大
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对象
用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元");
}