XML学习经验实例总结2
DTD约束 Book.dtd: <!ELEMENT 书架 (书+)> <!ELEMENT 书 (书名,价格,介绍)> <!ELEMENT 书名 (#PCDATA)> <!ELEMENT 价格 (#PCDATA)> <!ELEMENT 介绍 (#PCDATA)> 为书名设置属性 name(必须) <!ATTLIST 书名 name CDATA #REQUIRED> Book.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE 书架 SYSTEM "book.dtd"> <书架> <书> <书名 name="wy">计算机科学与技术</书名> <价格>36.0</价格> <介绍>这本书很好</介绍> </书> <书> <书名 name="ztt">科学管理课</书名> <价格>30.0</价格> <介绍>这本书挺好</介绍> </书> <书> <书名 name="wu">李清照集注</书名> <价格>60.0</价格> <介绍>这本书非常好</介绍> </书> </书架> Jaxp对xml进行DOM解析---读取 (1)获取XML中的书名 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(1); String content = node.getTextContent(); System.out.println(content); } (2)获取所有的节点 public void read2() 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 root) { if(root instanceof Element) System.out.println(root.getNodeName()); NodeList list=root.getChildNodes(); for(int i=0;i<list.getLength();i++) { Node child=list.item(i); list(child); } } (3)获取文档中的属性 public void read3() throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); Element bookname =(Element) document.getElementsByTagName("书名").item(0); String value=bookname.getAttribute("name"); System.out.println(value); } XML解析---增加 (1)默认在末尾添加节点 @Test public void add() throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); //创建节点 Element ele=document.createElement("价格"); ele.setTextContent("10元"); //创建节点挂在第一个节点上 Element book=(Element)document.getElementsByTagName("书").item(0); book.appendChild(ele); //把更新后内存写回到xml文档 TransformerFactory tffactory=TransformerFactory.newInstance(); Transformer tf=tffactory.newTransformer(); tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml"))); } (2) 在文档指定位置添加节点 @Test public void add2() throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); // 创建节点 Element ele = document.createElement("价格"); ele.setTextContent("10元"); // 得到参考节点 Element refNode = (Element) document.getElementsByTagName("价格").item(0); // 得到要挂的节点 Element book = (Element) document.getElementsByTagName("书").item(0); // 往book节点的指定位置插孩子节点 book.insertBefore(ele, refNode); // 把更新后内存写回到xml文档 TransformerFactory tffactory = TransformerFactory.newInstance(); Transformer tf = tffactory.newTransformer(); tf.transform(new DOMSource(document), new StreamResult( new FileOutputStream("src/book.xml"))); } (3) 在文档中为标签添加属性 @Test public void addAttr() throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); Element bookname = (Element) document.getElementsByTagName("书名") .item(0); bookname.setAttribute("name", "wy"); TransformerFactory tffactory = TransformerFactory.newInstance(); Transformer tf = tffactory.newTransformer(); tf.transform(new DOMSource(document), new StreamResult( new FileOutputStream("src/book.xml"))); } 删除 1.删除1 @Test public void delete1() throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); // 得到要删除的节点 Element ele = (Element) document.getElementsByTagName("价格").item(0); // 得到要删除的节点的父节点 Element book = (Element) document.getElementsByTagName("书").item(0); // 父节点删除子节点 book.removeChild(ele); TransformerFactory tffactory = TransformerFactory.newInstance(); Transformer tf = tffactory.newTransformer(); tf.transform(new DOMSource(document), new StreamResult( new FileOutputStream("src/book.xml"))); } (2)删除2 @Test public void delete2() throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); // 得到要删除的节点 Element ele = (Element) document.getElementsByTagName("价格").item(0); ele.getParentNode().getParentNode().removeChild(ele.getParentNode()); TransformerFactory tffactory = TransformerFactory.newInstance(); Transformer tf = tffactory.newTransformer(); tf.transform(new DOMSource(document), new StreamResult( new FileOutputStream("src/book.xml"))); } 5更新 @Test public void update() throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); Element ele=(Element)document.getElementsByTagName("价格").item(0); ele.setTextContent("100元"); //把更新后的内存写到xml文档中去 TransformerFactory tffactory = TransformerFactory.newInstance(); Transformer tf = tffactory.newTransformer(); tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml"))); } SAX解析XML 1.步骤: //创建工厂 SAXParserFactory factory=SAXParserFactory.newInstance(); //得到解析器 SAXParser sp=factory.newSAXParser(); //得到读取器 XMLReader reader=sp.getXMLReader(); //设置内容处理器 reader.setContentHandler(new ListHandler()); //读取xml文档内容 reader.parse("src/book.xml");