XML编程
Dom解析流程
dom以对象的方式解析
缺点:占用内存比较多(如果文件比较大),不适合大文档。全部内容读物到内存,创建document对象
优点:增删改查比较方便。
Sax 读取一行就处理一行,占用的内存比较少,解析速度快。
缺点:不适合增删改,适合读取
调整jvm大小:
Runconfiguretion
Jaxp
使用jasp进行dom解析:
book.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 书架 [
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
]>
<书架>
<书>
<书名 name="xxx">钢铁是怎样炼成的</书名>
<作者>尼·奥斯特洛夫斯基 </作者>
<售价>16.5</售价>
</书>
<书>
<书名>假如给我三天光明</书名>
<作者>海伦·凯勒 </作者>
<售价>17.6</售价>
</书>
</书架>
package cn.xml;
import java.io.FileOutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Result;
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;
//使用dom方式对xml文档进行增删改查
public class Demo3 {
//读取xml文档中的<书名>钢铁是怎样炼成的</书名> 节点中的值
@Test
public void read() throws Exception{
DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");
NodeList list=document.getElementsByTagName("书名");
Node node = list.item(0);
String content = node.getTextContent();
System.out.println(content);
}
//得到xml中的文档标签
@Test
public void read1() throws Exception{
DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");
//得到根节点
Node root = document.getElementsByTagName("书架").item(0);
list(root);
}
private void list(Node node){
if (node instanceof Element){
System.out.println(node.getNodeName());
}
NodeList list = node.getChildNodes();
for (int i=0;i<list.getLength();i++){
Node child = list.item(i);
list(child);
}
}
//得到xml中的文档标签 属性的值
@Test
public void read2() throws Exception{
DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");
//Node node = document.getElementsByTagName("书名").item(0);
Element node = (Element) document.getElementsByTagName("书名").item(0);
String str = node.getAttribute("name");
System.out.println(str);
}
//得到xml中添加节点:<售价>59.00元</售价>
@Test
public void add() throws Exception{
DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");
//创建节点
Element price = document.createElement("售价");
price.setTextContent("59.00元");
//把创建的节点挂到第一本书上
Node node = document.getElementsByTagName("书").item(0);
node.appendChild(price);
//把更新后的内存写回到xml文档
TransformerFactory tffaxtory = TransformerFactory.newInstance();
Transformer tf= tffaxtory.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/bppk.xml")));
}
//得到xml中指定位置添加节点:<售价>59.00元</售价>
@Test
public void add2() throws Exception{
DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");
//创建节点
Element price = document.createElement("售价");
price.setTextContent("59.00元");
//得到参考节点
Element refnode = (Element) document.getElementsByTagName("售价").item(0);
//得到父节点
Node node = document.getElementsByTagName("书").item(0);
//向父节点的指定节点插入
node.insertBefore(price, refnode);
//把更新后的内存写回到xml文档
TransformerFactory tffaxtory = TransformerFactory.newInstance();
Transformer tf= tffaxtory.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/bppk.xml")));
}
//得到xml中文档节点中添加属性。<书名>钢铁是怎样炼成的</书名>添加name="xxx";
@Test
public void addattr() throws Exception{
DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");
Element node = (Element) document.getElementsByTagName("书名").item(0);
node.setAttribute("name", "xxx");
//把更新后的内存写回到xml文档
TransformerFactory tffaxtory = TransformerFactory.newInstance();
Transformer tf= tffaxtory.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/bppk.xml")));
}
//删除xml中指定标签
@Test
public void delete() throws Exception{
DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");
//得到要删除的节点
Element node = (Element) document.getElementsByTagName("售价").item(0);
//得到要删除节点的父节点:
Element fnode = (Element) document.getElementsByTagName("书").item(0);
//父节点删除
fnode.removeChild(node);
//或者 node.getParentNode().removeChild(node); 上面三步可简化成一步;
//node.getParentNode().getParentNode().removeChild(node.getParentNode()); 删除父节点
//把更新后的内存写回到xml文档
TransformerFactory tffaxtory = TransformerFactory.newInstance();
Transformer tf= tffaxtory.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/bppk.xml")));
}
//更新价格
@Test
public void uodate() throws 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元");
//把更新后的内存写回到xml文档
TransformerFactory tffaxtory = TransformerFactory.newInstance();
Transformer tf= tffaxtory.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/bppk.xml")));
}
}