作业[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 |
dom解析XML文件
最新推荐文章于 2022-09-19 20:31:51 发布