1.Node准备
Node接口是整个文档对象模型的主要数据类型,它表示该文档树中的单个节点。例如Attr, CharacterData, Comment, Text,Element都是Node的子类。 xml解析的误区: 在xml文件解析过程中,所有信息都被当做一个对象,例如解析下面的语句
/* * <book>AAA<name>java语法</name>BBB</book> * 该book下的直接子节点有3个,AAA和BBB被解析为CharacterData类型的节点,<name>被解析为Element类型的节点, * * <book> <name>java语法</name> </book> * 该book下的直接子节点有3个,由于在<name>之前有个换行,CharacterData类型的节点 * <book><name>java语法</name></book> 该book下的直接子节点只有1个 */
2.Dom解析优缺点
优点:整个文档读入内存,方便操作:支持修改、删除和重现排列等多种功能。
缺点:将整个文档读入内存中,保留了过多的不需要的节点,浪费内存和空间。
3.Dom解析xml
/** * 解析xml文件,遍历并所有信息 */ public static void parseXMl() { try { // 1.通过DocumentBuilder工厂得到对应的xml解析器 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); // 2.通过解析器得到Document对象 Document doc = builder.parse("d:/my.xml"); // 3.解析数据 /* * <book> * <name>javaWeb</name> * <author>fanglx</author> * <price>30.90</price> * </book> */ //得到所有的book的标签的nodelist NodeList nodeList = doc.getElementsByTagName("book"); //遍历每个book节点 for(int i=0; i<nodeList.getLength(); i++){ Node node = nodeList.item(i); //当前遍历的book节点 //得到该book节点下的所有的直接子节点 NodeList childNodes = node.getChildNodes(); for(int j=0; j<childNodes.getLength(); j++){ Node childNode = childNodes.item(j); //如果当前的childNode节点是一个标签,CharacterData类型的文本节点则不执行 if(childNode instanceof Element){ String fieldName = childNode.getNodeName(); //当前节点名称 比如author String value = childNode.getTextContent(); //当前节点的text值比如fanglx /* * 或者下面方式得到value值 * String value = childNode.getFirstChild().getNodeName();//fanglx */ System.out.println(fieldName+"="+value); //author=fanglx } } } } catch (Exception e) { e.printStackTrace(); } }/** * 对xml文件的更新 */ public static void updateXMl() { try { // 1.通过DocumentBuilder工厂得到对应的xml解析器 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); // 2.通过解析器得到Document对象 Document doc = builder.parse("d:/my.xml"); // 3.更新数据 /* * <book> * <name>javaWeb</name> * <author>fanglx</author> * <price>30.90</price> * </book> */ NodeList nodeList = doc.getElementsByTagName("book"); Element parentEle = (Element) nodeList.item(0); //直接在子标签的尾部增加<num id="1001">25</num> Element childEle = doc.createElement("num"); childEle.setAttribute("id", "1001");//设置属性 childEle.setTextContent("25"); //设置值 parentEle.appendChild(childEle); //直接在price标签前面增加<age id="25">mm</age> Element newChild = doc.createElement("age"); newChild.setAttribute("id", "25"); //设置属性 newChild.setTextContent("mm"); //设置值 Element refChild = (Element) parentEle.getElementsByTagName("price").item(0); parentEle.insertBefore(newChild, refChild); // 4.保存更新的数据 TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer = tFactory.newTransformer(); transformer.transform(new DOMSource(doc), new StreamResult(new File("c:/my.xml"))); } catch (Exception e) { e.printStackTrace(); } }<?xml version="1.0" encoding="UTF-8" standalone="no"?> <books> <book> <name>javaWeb</name> <author>fanglx</author> <price>30.90</price> </book> </books>