DOM 文档对象模型
基于XML文档树结构解析
适用于多次访问的xml文档
特点:比较消耗资源
1).Document对象
NodeList getElementsByTagName(String name):指定节点名称的元素集合,返回NodeList对象
Element getDocumentElement():
2).NodeList对象
指包含了一个或者多个节点(Node)的列表.
getLength():返回列表的长度.
item(int index):返回指定位置的Node对象
3).Node对象
getChildNodes():包含此节点的所有子节点的NodeList
getFirstChild():如果节点存在子节点,则返回第一个子节点
getLastChild():如果节点存在子节点,则返回最后一个子节点
getNextSibling():返回在DOM树中这个节点的下一个兄弟节点
getPreviousSibling():返回在DOM树中这个节点的上一个兄弟节点
getNodeName():返回节点的名称
getNodeValue():返回节点的值
getNodeType():返回节点的类型
4).Element对象
Node的子对象
getAttribute(String attributename):返回标签中给定属性名称的属性的值
getElementsByTagName(String name):返回具有给定标记名称的所有后代Elements的NodeList
if (typeNode.getNodeType()==Node.ELEMENT_NODE):判断是否为元素节点
//添加子节点 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db; try { db = dbf.newDocumentBuilder(); Document document = db.parse("src/com/xml/PhoneInfo.xml"); //创建Brand节点 Element element = document.createElement("Brand"); element.setAttribute("name", "MOTO"); //创建Type节点 Element typElement = document.createElement("Type"); typElement.setAttribute("name", "摩托罗拉"); //创建Item节点 Element itemeElement = document.createElement("Item"); //添加父子关系 typElement.appendChild(itemeElement); element.appendChild(typElement); Element phoneElement = (Element)document.getElementsByTagName("PhoneInfo").item(0); phoneElement.appendChild(element); //保存xml文件 TransformerFactory tff = TransformerFactory.newInstance(); try { Transformer transformer = tff.newTransformer(); DOMSource domSource = new DOMSource(document); //设置编码类型 transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8"); StreamResult result = new StreamResult(new FileOutputStream("src/com/xml/PhoneInfo.xml")); //把DOM树转换成XML文件 transformer.transform(domSource, result); } catch (TransformerConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (TransformerException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
//修改子节点 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db; try { db = dbf.newDocumentBuilder(); Document document = db.parse("src/com/xml/PhoneInfo.xml"); NodeList nodeList = document.getElementsByTagName("Type"); for (int i=0;i<nodeList.getLength();i++){ Element element = (Element)nodeList.item(i); String brandName = element.getAttribute("name"); System.out.println("修改前:"+brandName); if ("iphone4".equals(brandName)){ element.setAttribute("name", "iPad"); } } //保存xml文档 TransformerFactory tff = TransformerFactory.newInstance(); try { Transformer transformer = tff.newTransformer(); DOMSource domSource = new DOMSource(document); //设置编码类型 transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8"); StreamResult result = new StreamResult(new FileOutputStream("src/com/xml/PhoneInfo.xml")); //把DOM树转换成XML文件 transformer.transform(domSource, result); } catch (TransformerConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (TransformerException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
//删除节点 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { DocumentBuilder db = dbf.newDocumentBuilder(); Document document = db.parse("src/com/xml/PhoneInfo.xml"); NodeList list = document.getElementsByTagName("Brand"); for (int i=0;i<list.getLength();i++){ Element element = (Element)list.item(i); String brandName = element.getAttribute("name"); if ("MOHAHA".equals(brandName)){ element.getParentNode().removeChild(element); } } //保存文件 TransformerFactory tff = TransformerFactory.newInstance(); try { Transformer transformer = tff.newTransformer(); DOMSource domSource = new DOMSource(document); //设置编码类型 transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8"); StreamResult result = new StreamResult(new FileOutputStream("src/com/xml/PhoneInfo.xml")); //把DOM树转换成XML文件 transformer.transform(domSource, result); } catch (TransformerConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (TransformerException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
设置缩进:
①
TransformerFactory tff = TransformerFactory.newInstance();
tff.setAttribute("indent-number", 4);
②
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
StreamResult result = new StreamResult(new OutputStreamWriter(new FileOutputStream("src/com/xml/Phone.xml"),"utf-8"));