xml 1 Dom解析

XML编程(CRUD)。。。。。。。。。

XML解析方式分为两种:dom和sax


dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。

sax: (Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。

dom的特点:

1、 优点:

使用dom解析xml文档,实现crud特别方便,操作速度也比较快。

 

2、 缺点

使用dom解析xml文档,如果文件比较大,对内存消耗就特别大,极容易导致内存溢出,所以dom方式不适合操作大的xml文档。

Sax特点:

1、 解析速度快、对内存占用少,查找数据特别方便

 

2、只适合查找数据,不适合作增删改操作




调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。
调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。
调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。

//获取工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//产生解析器
DocumentBuilder builder= factory.newDocumentBuilder();
//解析xml文档,得到代表文档的文档document
Document document = builder.parse(new File("src/book.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 对象来表示数据的目的地。
 Transformer对象通过TransformerFactory获得。

//把内存中的document写到xml文档中
TransformerFactory tf = TransformerFactory.newInstance();
//得到转换器
Transformer ts = tf.newTransformer();
ts.transform(new DOMSource(document), new StreamResult(new File("src/book.xml")));


//遍历节点
public static void list(Node node)
{
if(node.getNodeType()==Node.ELEMENT_NODE)
{
System.out.println(node.getNodeName());
}
NodeList list = node.getChildNodes();
for(int i=0;i<list.getLength();i++)
{
Node child = list.item(i);
list(child);
}
}

增加节点

public void add2() throws SAXException, IOException, ParserConfigurationException, TransformerException
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File("src/book.xml"));

//创建增加的节点
Node node = document.createElement("售价");
node.setTextContent("39元");

//得到需要增加节点的父亲
Node parent = document.getElementsByTagName("书").item(0);
parent.insertBefore(node,document.getElementsByTagName("书名").item(0) );

//把内存中的document写到xml文档中
TransformerFactory tf = TransformerFactory.newInstance();
    //得到转换器
Transformer ts = tf.newTransformer();
ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));
}

删除节点

//删除文档中的内容
public void delete() throws SAXException, IOException, ParserConfigurationException, TransformerException
{
//获取工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//产生解析器
DocumentBuilder builder= factory.newDocumentBuilder();
//解析xml文档,得到代表文档的文档document
Document document = builder.parse(new File("src/book.xml"));


//删除谁就先得到谁
Node node = document.getElementsByTagName("售价").item(1);
//java里面没有提供对象自己把自己给删了的方法,可以得到他爸爸。用爸爸把儿子给删了
node.getParentNode().removeChild(node);

//把内存中的document写到xml文档中
TransformerFactory tf = TransformerFactory.newInstance();
//得到转换器
Transformer ts = tf.newTransformer();
ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));


}

//操作xml文档中的属性
@Test
public void updateAttribute() throws TransformerException, ParserConfigurationException, SAXException, IOException
{
//获取工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//产生解析器
DocumentBuilder builder= factory.newDocumentBuilder();
//解析xml文档,得到代表文档的文档document
Document document = builder.parse(new File("src/book.xml"));

//操作xml的文档元素是,一般都把元素当作Node对待,但是程序员发现Node不好用时,就把Node强转为Element
Node node = (Element) document.getElementsByTagName("书").item(0);
Element book = null;
//在节点转换之前,最好先判断节点类型
if(node.getNodeType()==Node.ELEMENT_NODE)
{
book = (Element) node;
}
book.setAttribute("name", "yyyyyy");

//也可以增加属性
book.setAttribute("password", "1234");


//把内存中的document写到xml文档中
TransformerFactory tf = TransformerFactory.newInstance();
//得到转换器
Transformer ts = tf.newTransformer();
ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));
}


 //修改节点中的值:<售价>1221212</售价>改为<售价>1314</售价>
public void update() throws ParserConfigurationException, SAXException, IOException, TransformerException
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File("src/book.xml"));

NodeList list = document.getElementsByTagName("售价");
Node price = list.item(0);
price.setTextContent("109");

//把内存中的document写到xml文档中
TransformerFactory tf = TransformerFactory.newInstance();
//得到转换器
Transformer ts = tf.newTransformer();
ts.transform(new DOMSource(document), new StreamResult(new File("src/book.xml")));
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值