- DOM方式解析xml文件
- 在Java程序中如何获取xml文件的内容
- 在Java程序中读取xml文件的过程也称为解析xml文件
- 解析的目的:获取节点名、节点值、属性名、属性值
- 四种解析方式:DOM、SAX、DOM4J、JDOM (前两种是Java官方提供的)
- 本次学习了DOM方式解析xml文件
- 代码如下
-
books.xmlpackage domTest; import java.io.IOException; 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; import org.xml.sax.SAXException; public class DomTest { public static void main(String[] args) throws SAXException, IOException { // 创建一个DocumentBuilderFactory的对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { // 创建一个DocumentBuilder对象 DocumentBuilder db = dbf.newDocumentBuilder(); // 通过DocumentBuilder对象的parse(String fileName)方法解析xml文件 Document document = db.parse("books.xml"); // 获取所有book节点的集合 NodeList bookList = document.getElementsByTagName("book"); // 通过nodelist.getLength()方法来获取bookList的节点个数 System.out.println(bookList.getLength()); // 遍历每一个book节点 for (int i = 0; i < bookList.getLength(); i++) { System.out.println("---------现在开始遍历第" + (i + 1) + "本书的内容---------------"); // 通过 item(i)方法获取一个book节点,notelist的索引值从0开始 Node book = bookList.item(i); // 获取book节点的所有属性集合 NamedNodeMap attrs = book.getAttributes(); System.out.println("第" + (i + 1) + "本书共有" + attrs.getLength() + "个属性"); // 遍历book的属性 for (int j = 0; j < attrs.getLength(); j++) { // 通过item(index)方法获取book节点的某个属性 Node attr = attrs.item(j); // 获取属性名 System.out.print("属性名" + attr.getNodeName()); // 获取属性值 System.out.println("-----属性值" + attr.getNodeValue()); } // 解析book节点的子节点 NodeList childNodes = book.getChildNodes(); // 遍历childNodes获取每个节点的节点名和节点值 System.out.println("第" + (i + 1) + "本书共有" + childNodes.getLength() + "字节点"); for (int k = 0; k < childNodes.getLength(); k++) { // 区分出text类型的node以及element类型的node if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) { //获取了element类型节点的节点名 System.out.print("第"+(k+1)+"个节点的节点名为:"+childNodes.item(k).getNodeName()); //获取了element类型节点的节点值 //System.out.println("----节点值为:"+childNodes.item(k).getFirstChild().getNodeValue()); System.out.println("----节点值为:"+childNodes.item(k).getTextContent()); } } System.out.println("------------------结束遍历-------------------"); } } catch (ParserConfigurationException e) { e.printStackTrace(); } } }
运行结果截图<?xml version="1.0" encoding="UTF-8"?> <bookstore> <book id="1"> <name>冰与火之歌</name> <author>乔治马丁</author> <year>2014</year> <price>89</price> </book> <book id="2"> <name>安徒生童话</name> <year>2004</year> <price>77</price> <language>English</language> </book> </bookstore>