【Javaweb学习】解析XML

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 }
View Code

更新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();

 

posted @ 2016-12-20 15:55  刘一二  阅读(268)  评论(0编辑  收藏  举报