`
diarbao
  • 浏览: 14279 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SAX解析XML出现特殊字符

阅读更多
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SaxParseService extends DefaultHandler{
    private List<Book> books = null;
    private Book book = null;
    private String preTag = null;//作用是记录解析时的上一个节点名称
    /**
     * 特殊字符数量很多时方法1显然不实用此时可用转义来实现 
     * &lt; <   
     * &gt; >   
     * &amp; &
     * &apos; '
     * &quot; " 
     * 即将xml中的特殊文档全部替换为转义字符
     * 如<name><thinking in java ><name>变成<name>&lt;thinking in java&gt;<name>。 
     * 但是对于这种情况解析过程会发生变化不是一次性解析<thinking in java >
     * 而是分三步先解析&lt;然后是thinking in java然后是&gt;
     * 因此要注意想要获得<name>中数据必须要用StringBuffer将这三部分加起来。
     * 
     */
    StringBuffer sb = new StringBuffer();
    
    public List<Book> getBooks(InputStream xmlStream) throws Exception{
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        SaxParseService handler = new SaxParseService();
        parser.parse(xmlStream, handler);
        return handler.getBooks();
    }
    
    public List<Book> getBooks(){
        return books;
    }
    
    @Override
    public void startDocument() throws SAXException {
        books = new ArrayList<Book>();
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        sb.delete(0, sb.length());  //清除字符内容
        if("book".equals(qName)){
            book = new Book();
            book.setId(Integer.parseInt(attributes.getValue(0)));
        }
        preTag = qName;//将正在解析的节点名称赋给preTag
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if("book".equals(qName)){
            books.add(book);
            book = null;
        }
        preTag = null;/**当解析结束时置为空。这里很重要,例如,当图中画3的位置结束后,会调用这个方法
        ,如果这里不把preTag置为null,根据startElement(....)方法,preTag的值还是book,当文档顺序读到图
        中标记4的位置时,会执行characters(char[] ch, int start, int length)这个方法,而characters(....)方
        法判断preTag!=null,会执行if判断的代码,这样就会把空值赋值给book,这不是我们想要的。*/
    }
    
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if(preTag!=null){
//            String content = new String(ch,start,length);
            sb.append(ch,start,length);//字符相加
            String content =sb.toString();
            if("name".equals(preTag)){
                book.setName(content);
            }else if("price".equals(preTag)){
                book.setPrice(Float.parseFloat(content));
            }
        }
    }
    
}


public class Book {
    private int id;
    private String name;
    private float price;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public float getPrice() {
        return price;
    }
    public void setPrice(float price) {
        this.price = price;
    }
    @Override
    public String toString(){
        return this.id+":"+this.name+":"+this.price;
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book id="12">
        <name>&lt;thing in java ></name>
        <price>45.0</price> 
    </book>
    <book id="15">
        <name>Spring in Action</name>
        <price>39.0</price>
    </book>
</books>

采用JUNIT4测试
public class Test {
     @org.junit.Test
     public void testSAX() throws Throwable{  
            SaxParseService sax = new SaxParseService();  
            InputStream input = this.getClass().getClassLoader().getResourceAsStream("book.xml");  
            List<Book> books = sax.getBooks(input);  
            for(Book book : books){  
                System.out.println(book.getName());  
            }  
        }}
分享到:
评论

相关推荐

    Sax解析XML文件解析

    **SAX解析XML的基本原理:** SAX解析器以流式的方式读取XML文档,当遇到文档的各个元素时,会触发相应的事件,如开始文档、开始元素、结束元素、字符数据等。程序员通过实现SAX解析器的回调接口来处理这些事件,从而...

    Servlet利用SAX解析XML文档

    本主题将深入探讨如何在Servlet中利用SAX解析XML文档。 首先,我们需要了解SAX解析的基本原理。SAX解析器不创建整个XML文档树,而是当遇到XML文档的各个部分(如元素、属性、文本等)时,触发相应的事件回调函数。...

    sax解析xml尤其是获取元素的值或者内容

    本文将深入探讨如何使用SAX解析XML并获取元素的值或内容。 首先,SAX解析器以流式方式读取XML文档,当遇到文档的不同部分时,会触发相应的事件,如开始文档、开始元素、结束元素等。开发者可以注册事件处理器来响应...

    SAX解析XML实例

    总的来说,SAX解析XML是一种高效且灵活的方法,适用于处理大型XML文档。通过自定义事件处理器,我们可以根据业务需求定制解析逻辑,从而有效地解析和利用XML数据。在实际项目中,结合源码分析和工具使用,如IDE中的...

    解析XML特殊字符方法

    有两种主要方法来解析XML中的特殊字符: **方法一:使用实体引用** 实体引用是XML中最常见的处理特殊字符的方式。当你需要在XML文档中插入特殊字符时,可以使用对应的实体引用。比如,如果你想在文本中包含一个...

    android SAX解析String类型 XML 字符串

    接着,我们需要创建一个`XMLReader`对象并设置我们的处理器,然后使用`parse`方法解析XML字符串: ```java InputSource inputSource = new InputSource(new StringReader(xmlString)); XMLReader xmlReader = ...

    sax解析xml本地读取xml

    标题“sax解析xml本地读取xml”指的是使用SAX解析器来读取和解析存储在本地文件系统中的XML文件。这种方式适用于处理那些无法一次性加载到内存中的大型XML文档,或者对于内存有限的环境。 SAX解析的基本工作原理...

    一个关于sax解析xml的demo

    这个"Project1231_001_XML_SAX"可能包含了一个简单的XML文件和对应的SAX解析示例代码,通过运行这个项目,开发者可以了解如何在实际应用中使用SAX解析XML数据,以及如何处理XML文档中的不同结构。学习和理解SAX解析...

    java解析xml数据---sax解析器

    以下是使用SAX解析XML的基本步骤: 1. 创建一个实现DefaultHandler或ContentHandler接口的类,重写其中的方法,如startElement()、endElement()和characters(),用于处理XML文档的结构和数据。 2. 实例化SAX解析器...

    android使用SAX解析xml

    - `xmlSAXPaserDemo`可能是一个包含示例代码的Android项目,用于演示如何实际使用SAX解析XML文件。 - 项目中可能包括网络请求模块、SAX解析器处理类以及展示解析结果的UI部分。 通过以上步骤,开发者可以在...

    SAX解析xml文件源码

    下面将详细介绍SAX解析XML文件的基本原理、工作流程以及在Android环境下如何实现。 **SAX解析的基本原理:** SAX解析器在读取XML文档时会触发一系列的事件,如开始文档、结束文档、开始元素、结束元素、字符数据等...

    [Android]使用SAX解析XML文件

    以下是使用SAX解析XML文件的步骤: 1. 引入依赖:在Android项目中,通常需要添加`xmlpull`库,它包含了SAX解析器。可以在`build.gradle`文件中添加依赖: ``` implementation 'xpp3:xpp3:1.1.4c' ``` 2. 创建...

    XML-java.rar_XML SAX_sax_sax xml_sax 解析 xml_xml using dom

    "sax_xml sax_解析_xml"标签表明了本压缩包包含使用SAX解析XML的示例代码。 3. **JDOM**:JDOM是一个Java API,专门用于读写XML文档。它提供了一个更面向Java的对象模型,使得XML处理更加直观。JDOM在DOM的基础上...

    XML解析之SAX解析DEMO

    SAX解析是一种基于事件驱动的解析方式,它不会一次性加载整个XML文档到内存,而是逐行读取,当遇到XML文档中的特定事件(如开始元素、结束元素、字符数据等)时,会触发相应的回调函数。这种解析方式适用于处理大型...

    sax解析xml实例

    本实例将通过SAX解析XML,帮助我们更好地理解和应用这一技术。 在SAX解析XML的过程中,主要涉及以下几个关键知识点: 1. **事件驱动模型**:SAX解析器在读取XML文档时,遇到每个元素、属性或文本节点时都会触发...

    SAX解析超大XML文件 示例代码

    最后,使用`saxParser.parse()`方法解析XML文件并传递我们的处理器。 在实际应用中,根据需求,你可能需要在处理器方法内进行更复杂的数据处理,例如存储数据、计算或验证。SAX解析器允许你在不消耗大量内存的情况...

    sax解析xml文件

    SAX解析XML的基本工作原理是:解析器在读取XML文档时,每当遇到文档的开始、结束、元素、属性等结构时,会触发相应的事件,通过回调函数将这些事件传递给应用程序。这种方式使得SAX解析器非常高效,但同时也限制了...

    SAX解析xml,vdx等文件

    标题中的"SAX解析xml",指的是利用SAX解析器来处理XML文件。SAX解析器按照XML文档的顺序触发一系列的事件,如开始文档、开始元素、结束元素等,开发者通过实现相应的事件处理器接口,对这些事件进行响应,从而实现对...

    JAVA SAX解析XML

    **JAVA SAX解析XML** 在Java编程中,XML(Extensible Markup Language)是一种广泛使用的数据交换格式,用于存储和传输结构化数据。为了处理XML文档,Java提供了两种主要的解析方式:DOM(Document Object Model)...

Global site tag (gtag.js) - Google Analytics