java解析xml文件(dom)
package com.xt.xmltest; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class XmlTest { public static void main(String[] args) throws Exception { //获得DocumentBuilderFactory对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); //获得DocumentBuilder对象 DocumentBuilder db = dbf.newDocumentBuilder(); //加载book.xml //相对路径、绝对路径都行 Document document = db.parse("book.xml"); //获得book节点集合 NodeList bookList = document.getElementsByTagName("book"); System.out.println("================一共有"+bookList.getLength()+"本书。================"); //循环遍历book节点集合 for(int i = 0; i<bookList.getLength();i++){ //获得第i+1个book节点 Node book = bookList.item(i); //获得第i+1个book节点中的属性的map集合 NamedNodeMap attrs = book.getAttributes(); //获得获得第i+1个book节点中的子节点的集合 NodeList childNodeList = book.getChildNodes(); System.out.println("第"+(i+1)+"个book节点中,共有"+attrs.getLength()+"个属性。"); for(int j=0;j<attrs.getLength();j++){ //获得属性名称 System.out.println("第"+(j+1)+"个属性名称是:"+attrs.item(j).getNodeName()); //获得属性值 System.out.println("第"+(j+1)+"个属性值是:"+attrs.item(j).getNodeValue()); } //输出的结果应该是:7,9。因为在java解析xml文件的时候,会将 换行 当成一个子节点 System.out.println("第"+(i+1)+"个book节点中,共有"+childNodeList.getLength()+"个子节点。"); for(int j=0;j<childNodeList.getLength();j++){ //将换行产生的子节点去除 if(childNodeList.item(j).getNodeType()==Node.ELEMENT_NODE){ //获得子节点名称以及节点值 //获得节点值得时候要注意:java解析过程中,会将节点之间的内容看成是子节点的子节点 System.out.println(childNodeList.item(j).getNodeName()+"-------->"+childNodeList.item(j).getFirstChild().getNodeValue()); System.out.println("=================================="); } } } } }
<?xml version="1.0" encoding="utf-8"?> <bookstore> <book id="1"> <name>钢铁是怎样炼成的</name> <author>奥斯特洛夫斯基</author> <price>99</price> </book> <book id="2"> <name>安徒生童话</name> <author>安徒生</author> <price>99</price> <year>1999</year> </book> </bookstore>