XML DOM解析
1.xml的解析方式有两种
Dom解析,Sax解析 2.(面试题)Dom解析和Sax解析两种解析方法的区别 (1)Dom解析的优点:对文档增删改查比较方便 缺点:占用内存比较大 (2)Sax解析的优点:占用内存少,解析速度快 缺点:不适合做文件的增删改 3.xml解析开发包 dom4j,Jdom,Jaxp(sun) 4.使用Jaxp对文档进行dom解析 @Test /** * 读指定文件 * @throws Exception */ 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); } /** * 读指定元素的指定属性 * @throws Exception */ @Test public void read2() 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文件 * @throws Exception */ @Test public void read3() 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); } /** * 具体的遍历方法 * @param node */ private void List(Node node) { //只打印标签,其余的不打印 if(node instanceof Element){ System.out.println(node); } //得到孩子节点 NodeList list = node.getChildNodes(); //递归遍历 for(int i=0;i<list.getLength();i++){ Node child = list.item(i); List(child); } } /** * 添加一个元素 * @throws Exception */ @Test public void addElement() throws Exception{ //解析文件 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); //创建要添加的元素 Element publish = document.createElement("出版社"); publish.setTextContent("新华出版社"); publish.setAttribute("name", "新华"); //找到要添加元素的父元素 Element book = (Element)document.getElementsByTagName("书").item(0); //找到要添加元素的参照元素 Element refElement = (Element)document.getElementsByTagName("售价").item(0); //将元素插入到相应的位置 book.insertBefore(publish, refElement); //将更新后内存写回到xml文档 TransformerFactory trsFactory = TransformerFactory.newInstance(); Transformer transformer = trsFactory.newTransformer(); transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml"))); } @Test /** * 删除指定元素 * @throws Exception */ public void delete() throws Exception{ //解析文件 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); Element publish = (Element)document.getElementsByTagName("出版社").item(0); Element book = (Element)document.getElementsByTagName("书").item(0); book.removeChild(publish); TransformerFactory trsfFactory = TransformerFactory.newInstance(); Transformer transformer = trsfFactory.newTransformer(); transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml"))); } /** * 删除指定元素(2) * @throws Exception * @throws SAXException */ @Test public void delete2() throws SAXException, Exception{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); Element publish = (Element)document.getElementsByTagName("出版社").item(0); publish.getParentNode().removeChild(publish); TransformerFactory trsFactory = TransformerFactory.newInstance(); Transformer transformer = trsFactory.newTransformer(); transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml"))); } /** * 删除指定节点所在的父节点 * @throws Exception */ @Test public void delete3() throws Exception{ //解析文件 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); //得到指定节点 Element publish = (Element)document.getElementsByTagName("出版社").item(0); //得到指定节点的父节点 Element parentElement = (Element) publish.getParentNode(); System.out.println(parentElement); //得到指定节点的爷爷节点 Element grandparentElement = (Element)parentElement.getParentNode(); //删除指定节点的父节点 grandparentElement.removeChild(parentElement); TransformerFactory trsFactory = TransformerFactory.newInstance(); Transformer transformer = trsFactory.newTransformer(); transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml"))); }