DOM解析XML浅析
来源:互联网 发布:淘宝怎么查看退货率 编辑:程序博客网 时间:2024/05/20 21:18
最近在调试科大讯飞语音的时候,里面用到了xml解析,简单探究,记录一下成长历程。
Java中操作DOM中常用的类
- Node
数据类型基类 - Element
最常用的类 - Attr
Element的属性 - Text
Element or Attr的内容 - Document
代表整个XML文档,代表DOM tree
使用DOM的步骤
1.导入相关类
import org.w3c.dom.*;import javax.xml.parsers.*;import java.io.*;Create a DocumentBuilder
2.创建DocumentBuilder对象
DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();
3.从文件或流中创建Document对象
StringBuilder xmlStringBuilder = new StringBuilder();xmlStringBuilder.append("<?xml version=\"1.0\"?> <class> </class>");ByteArrayInputStream input = new ByteArrayInputStream( xmlStringBuilder.toString().getBytes("UTF-8"));Document doc = builder.parse(input);
4 提取根元素
Element root = document.getDocumentElement();
5 处理属性&&子节点
//returns specific attributeelement.getAttribute("attributeName"); //returns a Map (table) of names/valueselement.getAttributes();//Examine sub-elements//returns a list of subelements of specified nameelement.getElementsByTagName("subelementName"); //returns a list of all child nodeselement.getChildNodes();
XML文件解析实例一
放到项目根目录下的,需要解析的input.txt文件,其内容如下:
<?XML version="1.0"?><class> <student rollno="393"> <firstname>dinkar</firstname> <marks>85</marks> </student> <student rollno="493"> <firstname>Vaneet</firstname> <marks>95</marks> </student> <student rollno="593"> <firstname>jasvir</firstname> <marks>90</marks> </student></class>
解析代码如下:
package com.example.xmlparse;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import java.io.File;public class FirstDOMParseDemo { public static void main(String[] args) { try { File inputFile = new File("input.txt"); //1.create DocumentBuilder object DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); //2.create Document object Document doc = dBuilder.parse(inputFile); doc.getDocumentElement().normalize(); //get root node System.out.println("Root element :" + doc.getDocumentElement().getNodeName()); //3.get student list; NodeList nList = doc.getElementsByTagName("student"); System.out.println("----------------------------"); for (int temp = 0; temp < nList.getLength(); temp++) { Node nNode = nList.item(temp); System.out.println("\nCurrent Element :" + nNode.getNodeName()); if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; //get attribute System.out.println("Student roll no : " + eElement.getAttribute("rollno")); //get element content System.out.println("First Name : " + eElement .getElementsByTagName("firstname") .item(0) .getTextContent()); System.out.println("Marks : " + eElement .getElementsByTagName("marks") .item(0) .getTextContent()); } } } catch (Exception e) { e.printStackTrace(); } }}
结果如下:
Root element :class----------------------------Current Element :studentStudent roll no : 393First Name : dinkarMarks : 85Current Element :studentStudent roll no : 493First Name : VaneetMarks : 95Current Element :studentStudent roll no : 593First Name : jasvirMarks : 90
XML解析实例二
这里将要解析的input2.txt文件放在项目的根目录下,其内容如下:
<?xml version="1.0"?><cars> <supercars company="Ferrari"> <carname type="formula one">Ferarri 101</carname> <carname type="sports car">Ferarri 201</carname> </supercars> <supercars company="Lamborgini"> <carname>Lamborgini 001</carname> </supercars></cars>
package com.example.xmlparse;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import java.io.File;public class SecondDOMParserDemo { public static void main(String argv[]) { try { File inputFile = new File("input2.txt"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(inputFile); doc.getDocumentElement().normalize(); System.out.println("Root element: " + doc.getDocumentElement().getNodeName()); NodeList nList = doc.getElementsByTagName("supercars"); System.out.println("----------------------------"); for (int temp = 0; temp < nList.getLength(); temp++) { Node nNode = nList.item(temp); System.out.print("\nCurrent Element :"); System.out.println(nNode.getNodeName()); if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; System.out.println("company : " + eElement.getAttribute("company")); NodeList carNameList = eElement.getElementsByTagName("carname"); for (int count = 0; count < carNameList.getLength(); count++) { Node node1 = carNameList.item(count); if (node1.getNodeType() == node1.ELEMENT_NODE) { Element car = (Element) node1; System.out.println("car name : " + car.getTextContent()); System.out.println("car type : " + car.getAttribute("type")); } } } } } catch (Exception e) { e.printStackTrace(); } }}
解析结果如下:
Root element: cars----------------------------Current Element :supercarscompany : Ferraricar name : Ferarri 101car type : formula onecar name : Ferarri 201car type : sports carCurrent Element :supercarscompany : Lamborginicar name : Lamborgini 001car type :
创建XML并写入文件实例
源代码如下:
package com.example.xmlparse;import org.w3c.dom.Attr;import org.w3c.dom.Document;import org.w3c.dom.Element;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import java.io.File;public class FirstCreateXMLDemo { public static void main(String argv[]) { try { DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.newDocument(); // root element Element rootElement = doc.createElement("cars"); doc.appendChild(rootElement); // supercars element Element supercar = doc.createElement("supercars"); rootElement.appendChild(supercar); // setting attribute to element Attr attr = doc.createAttribute("company"); attr.setValue("Ferrari"); supercar.setAttributeNode(attr); // carname element Element carname = doc.createElement("carname"); Attr attrType = doc.createAttribute("type"); attrType.setValue("formula one"); carname.setAttributeNode(attrType); carname.appendChild( doc.createTextNode("Ferrari 101")); supercar.appendChild(carname); final Element carname2 = doc.createElement("carname"); carname2.appendChild( doc.createTextNode("Ferrari 202")); supercar.appendChild(carname2); // write the content into xml file TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); DOMSource source = new DOMSource(doc); File file = new File("output.txt"); if (file.exists()) { file.delete(); } StreamResult result = new StreamResult(new File("output.txt")); transformer.transform(source, result); // Output to console for testing StreamResult consoleResult = new StreamResult(System.out); transformer.transform(source, consoleResult); } catch (Exception e) { e.printStackTrace(); } }}
创建的位于项目根目录下的output.txt的内容如下(没有进行格式化):
<?xml version="1.0" encoding="UTF-8" standalone="no"?><cars> <supercars company="Ferrari"> <carname type="formula one">Ferrari 101</carname> <carname>Ferrari 202</carname> </supercars></cars>
修改XML文件实例
这里使用的位于项目根目录下的output2.txt的文件内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><cars> <supercars company="Ferrari"> <carname type="formula one">Ferrari 101</carname> <carname type="sports">Ferrari 202</carname> </supercars> <luxurycars company="Benteley"> <carname>Benteley 1</carname> <carname>Benteley 2</carname> <carname>Benteley 3</carname> </luxurycars></cars>
修改代码如下:
package com.example.xmlparse;import org.w3c.dom.*;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import java.io.File;public class ModifyXmlFileDemo { public static void main(String argv[]) { try { File inputFile = new File("output2.txt"); DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); Document doc = docBuilder.parse(inputFile); Node cars = doc.getFirstChild(); cars.getNextSibling(); cars.getPreviousSibling(); cars.getFirstChild(); cars.getLastChild(); Node supercar = doc.getElementsByTagName("supercars").item(0); // update supercar attribute NamedNodeMap attr = supercar.getAttributes(); Node nodeAttr = attr.getNamedItem("company"); nodeAttr.setTextContent("Lamborigini"); // loop the supercar child node NodeList list = supercar.getChildNodes(); for (int temp = 0; temp < list.getLength(); temp++) { Node node = list.item(temp); if (node.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) node; if ("carname".equals(eElement.getNodeName())) { if ("Ferrari 101".equals(eElement.getTextContent())) { eElement.setTextContent("Lamborigini 001"); } if ("Ferrari 202".equals(eElement.getTextContent())) eElement.setTextContent("Lamborigini 002"); } } } NodeList childNodes = cars.getChildNodes(); for (int count = 0; count < childNodes.getLength(); count++) { Node node = childNodes.item(count); if ("luxurycars".equals(node.getNodeName())) cars.removeChild(node); } // write the content on console TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); DOMSource source = new DOMSource(doc); System.out.println("-----------Modified File-----------"); StreamResult consoleResult = new StreamResult(System.out); transformer.transform(source, consoleResult); } catch (Exception e) { e.printStackTrace(); } }}
结果如下:
-----------Modified File-----------<?xml version="1.0" encoding="UTF-8" standalone="no"?><cars> <supercars company="Lamborigini"> <carname type="formula one">Lamborigini 001</carname> <carname type="sports">Lamborigini 002</carname> </supercars></cars>
翻译地址
http://www.tutorialspoint.com/java_xml/java_dom_parser.htm
0 0
- DOM解析XML浅析
- XML DOM---解析xml dom
- 【XML】DOM解析XML
- 解析xml dom 解析
- xml解析 Dom解析
- dom解析xml
- dom解析 xml
- dom解析xml
- 解析xml之--DOM
- Dom解析XML文档
- DOM解析XML文件
- dom解析xml
- dom解析xml
- xml文件解析-DOM
- JAVA解析XML DOM
- DOM解析XML
- JAVA解析XML DOM
- XML DOM解析
- POJ 2096 Collecting Bugs
- Stacks原理剖析
- JVM异常FGC问题查找过程总结
- 第八章 Gleaming the Cube
- 303. Range Sum Query - Immutable
- DOM解析XML浅析
- 视频质量评价方法
- 华为OJ 初级:求解立方根
- MJRefresh
- SpringMVC注解
- 关于浏览器的font-size:62.5%;
- uva11396 爪分解
- 小sugar呀____最大子数组问题(算法导论)
- Linux文件搜索命令