dom解析XML文件

作业[cn.itcast.xml.sax.Demo2]

  1)SAX解析器中,一定要知道每方法何时执行,及SAX解析器会传入的参数含义

 

1 理解dom解析器机制

package cn.itcast.xml.dom;

 

import java.io.File;

 

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

 

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.NodeList;

 

//使用DOM解析器解析XML文件

public class Demo1 {

public static void main(String[] args) throws Exception {

//取得DOM解析器工厂

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

//获得DOM解析器

DocumentBuilder domParser = factory.newDocumentBuilder();

//加载需要解析的XML文件

Document document = domParser.parse(new File("src/cn/itcast/xml/dom/car.xml"));

//取得XML文档的根元素/节点

Element rootElement  = document.getDocumentElement();

System.out.println("根元素为:"+rootElement.getNodeName());

// 取得"汽车"元素的集合

NodeList nodeList = rootElement.getElementsByTagName("汽车");

// 获取集合长度

System.out.println("共有:" + nodeList.getLength()+"辆汽车");

System.out.println("++++++++++++++++++++++++++");

for(int i=0;i<nodeList.getLength();i++){

// 取得第N个元素,从0开始

Element element = (Element) nodeList.item(i);

String band = element.getElementsByTagName("车牌").item(0).getTextContent();

String place = element.getElementsByTagName("产地").item(0).getTextContent();

String price = element.getElementsByTagName("单价").item(0).getTextContent();

String time = element.getElementsByTagName("车牌").item(0).getAttributes().getNamedItem("出产时间").getTextContent();

System.out.println("车牌:" + band);

System.out.println("产地:" + place);

System.out.println("单价:" + price);

System.out.println("出产时间:" + time);

System.out.println("-------------------------");

}

}

}

获得解析文档对象

private static Document getDocument() throws Exception {

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

//设置dom解析器将空白字符过滤

factory.setIgnoringElementContentWhitespace(true);

DocumentBuilder domParser = factory.newDocumentBuilder();

Document document = domParser.parse(new File("src/cn/itcast/xml/dom/car.xml"));

return document;

}

//将内存中的document对象写到外存的xml文件

private void write2xml(Document document)throws Exception {

//将内存中的document对象写到外存的xml文件

TransformerFactory tf = TransformerFactory.newInstance();

Transformer transformer = tf.newTransformer();

//

Source source = new DOMSource(document);

//

Result result = new StreamResult(new File("src/cn/itcast/xml/dom/car.xml"));

transformer.transform(source,result);

}

 

@Test

public void create() throws Exception{

Document document = getDocument();

Element newCarElement = document.createElement("汽车");

newCarElement.setTextContent("我的汽车");

Element rootElement = document.getDocumentElement();

//rootElement.appendChild(newCarElement);

rootElement.insertBefore(

newCarElement,

rootElement.getElementsByTagName("汽车").item(1));

write2xml(document);

}

@Test

public void update() throws Exception{

Document document = getDocument();

Element secondCarElement = (Element) document.getElementsByTagName("汽车").item(1);

secondCarElement.getElementsByTagName("产地").item(0).setTextContent("深圳");

secondCarElement.getElementsByTagName("车牌").item(0).getAttributes().getNamedItem("出产时间").setTextContent("2012");

write2xml(document);

}

@Test

public void delete() throws Exception{

Document document = getDocument();

Element rootElement = document.getDocumentElement();

Element secondCarElement = (Element) rootElement.getElementsByTagName("汽车").item(1);

rootElement.removeChild(secondCarElement);

write2xml(document);

}

public static void main(String[] args) throws Exception{

Document document = getDocument();

Element rootElement = document.getDocumentElement();

NodeList nodeList = rootElement.getChildNodes();

System.out.println("共有" + nodeList.getLength()+"个直接元素");

}

总结:理解dom解析器机制

  1)dom解析和dom4j原理一致

  2)Node是所有元素的父接口

  3)常用的API

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();取得DOM解析器工厂

DocumentBuilder domParser = factory.newDocumentBuilder();取得DOM解析器

domParser.parse(*.xml)加载需要解析的XML文件

Document.getDocumentElement()取得XML文件的根元素/节点

Element.getNodeName():取得根元素

Element.getElementsByTagName("汽车")取得"汽车"元素的集合

NodeList.item(i)取得第N个元素,从0开始

Element.getTextContent():取得元素的文本内容

Element.getAttributes().getNamedItem("出产时间").getTextContent():取得元素中某属性的值

 

document.createElement("汽车");创建新元素

Element.setTextContent("我的汽车");设置元素的内容

Element.appendChild(newCarElement);在尾部添加元素

Element.insertBefore(newCarElement,

     rootElement.getElementsByTagName("汽车").item(1));在指定的元素前添加元素

 

TransformerFactory tf = TransformerFactory.newInstance();创建输出工厂

Transformer transformer = tf.newTransformer();创建输出对象

Source source = new DOMSource(document);创建内存的document对象

Result result = new StreamResult(new File("src/cn/itcast/xml/dom/car.xml"));指定输出的目标地点

transformer.transform(source,result);document对象输出到xml文件中

        Element.setTextContent("深圳");更新元素的内容

Element.removeChild(secondCarElement);在父元素基础上删除直接子元素

   4)dom解析器会将空白字符当作有效元素对待

   5)要让dom解析器将空白字符忽略,必须满足二条件

a)XML文件必须写一个DTD约束

b)factory.setIgnoringElementContentWhitespace(true);

   6)dom类解析器和sax类解析器

a)dom是一次性加载到内容,形成document对象,人工导航,适合curd

b)sax是分次性加载到内容,sax解析器导航,但程序员需要编写sax处理器,必须扩展DefaultHandler类,适合r

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值