1. 解析XML的方式有两种
dom:Document Object Model文档对象模型,是w3c组织推荐的解析方式
sax:Simple Api XML不是官方标准,但它是XML社区实际上的标准,几乎所有的XML解析器都支持它
区别:
dom需要读取整个XML文档,在内存中构建代表这个DOM树的Document对象,然后再对XML文档进行操作;
SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个XML文档装载完才会对文档进行操作。
2. XML解析开发包
2.1 JAXP开发包
JAXP开发包是JavaSE的一部分,由 javax.xml org.w3c.dom org.xml.sax 及其子包组成。
(1)DOM方式
- 遍历所有节点
- 查找某一个节点
- 删除结点
- 更新结点
- 添加节点
//1.创建工厂 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //2.得到dom解析器 DocumentBuilder builder = factory.newDocumentBuilder();//Add Exception //3.解析xml文档,得到代表文档的document Document document = builder.parse("src/book.xml");
//4.对xml文档进行操作 NodeList list = document.getElementsByTagName("书名"); Node bookNameNode = list.item(0); String content = bookNameNode.getTextContent(); System.out.println(content);
(2)SAX方式
SAX采用事件处理的方式解析文件,涉及两个部分:解析器和事件处理器。创建出解析器后,就可以采用SAX方式解析XML文档,只要解析到文档的一个组成部分,都会调用事件处理器的一个方法,并把当前解析到的xml内容作为方法的参数传递给事件处理器。事件处理器由开发者编写自己的业务逻辑。
sax解析例子
1 public class Demo1 { 2 3 /** 4 * @throws SAXException 5 * @throws ParserConfigurationException 6 * @throws IOException 7 */ 8 public static void main(String[] args) throws ParserConfigurationException, 9 SAXException, IOException { 10 11 // 1.创建解析工厂 12 SAXParserFactory factory = SAXParserFactory.newInstance(); 13 14 // 2.得到解析器 15 SAXParser sp = factory.newSAXParser(); 16 17 // 3.得到读取器 18 XMLReader xmlReader = sp.getXMLReader(); 19 20 // 4.设置内容处理器 21 xmlReader.setContentHandler(new ListHandler()); 22 23 // 5.读取xml文档内容 24 xmlReader.parse("src/book.xml"); 25 } 26 27 } 28 29 // 得到文档的所有内容 30 class ListHandler implements ContentHandler { 31 32 @Override 33 public void setDocumentLocator(Locator locator) { 34 // TODO Auto-generated method stub 35 36 } 37 38 @Override 39 public void startDocument() throws SAXException { 40 // TODO Auto-generated method stub 41 42 } 43 44 @Override 45 public void endDocument() throws SAXException { 46 // TODO Auto-generated method stub 47 48 } 49 50 @Override 51 public void startPrefixMapping(String prefix, String uri) 52 throws SAXException { 53 // TODO Auto-generated method stub 54 55 } 56 57 @Override 58 public void endPrefixMapping(String prefix) throws SAXException { 59 // TODO Auto-generated method stub 60 61 } 62 63 @Override 64 public void startElement(String uri, String localName, String qName, 65 Attributes atts) throws SAXException { 66 System.out.println("<" + qName + ">"); 67 68 for(int i=0; atts!=null && i<atts.getLength(); i++){ 69 String name = atts.getQName(i); 70 String value = atts.getValue(i); 71 System.out.println("(" +name+ "=" +value+ ")"); 72 } 73 } 74 75 @Override 76 public void endElement(String uri, String localName, String qName) 77 throws SAXException { 78 System.out.println("</" + qName + ">"); 79 80 } 81 82 @Override 83 public void characters(char[] ch, int start, int length) 84 throws SAXException { 85 System.out.println(new String(ch, start, length)); 86 87 } 88 89 @Override 90 public void ignorableWhitespace(char[] ch, int start, int length) 91 throws SAXException { 92 // TODO Auto-generated method stub 93 94 } 95 96 @Override 97 public void processingInstruction(String target, String data) 98 throws SAXException { 99 // TODO Auto-generated method stub 100 101 } 102 103 @Override 104 public void skippedEntity(String name) throws SAXException { 105 // TODO Auto-generated method stub 106 107 } 108 109 }
更新XML文档例子
//将更改后的内存document写入xml文档 TransformerFactory tffactory = TransformerFactory.newInstance(); Transformer tf = tffactory.newTransformer(); tf.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book2.xml")));
2.2 Dom4j开发包
dom4j是简单灵活的开源库,性能优异、功能强大、容易使用,不仅hibernate在用,连sun公司自己都在用。
//DOM4j中,获得Document对象的方式有三种: //1.读取XML文件,获得document对象 SAXReader reader = new SAXReader(); Document document = reader.read(new File("input.xml")); //2.解析XML形式的文本,得到document对象. String text = "<members></members>"; Document document = DocumentHelper.parseText(text); //3.主动创建document对象. Document document = DocumentHelper.createDocument(); //创建根节点 Element root = document.addElement("members");
//Document对象写入xml文件中 OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("gb2312"); XMLWriter xw = new XMLWriter(new FileOutputStream("src/book.xml"),format); xw.write(document); xw.close();