XML解析的三种方式

1.PUll解析
public static List xmlParser(InputStream is) {
List list = new ArrayList();

    try {
        // 构建XmlPullParser解析器实例
        XmlPullParser xmlParser = Xml.newPullParser();
        // setInput将数据流设置在解析器当中
        xmlParser.setInput(is, "utf-8");
        // 获得事件类型
        int eventType = xmlParser.getEventType();
        //用来存储标签名字的变量
        String tagName = "";
        Cate cate = null;
        while (eventType != XmlPullParser.END_DOCUMENT) {
            switch (eventType) {
            case XmlPullParser.START_DOCUMENT:
                Log.i(TAG, "START_DOCUMENT");
                break;
            case XmlPullParser.START_TAG:
                Log.i(TAG, "START_TAG");
                //通过getName()获得标签名称,此方法只适用于开始标签与结束标签事件
                tagName = xmlParser.getName();
                if (tagName.equals("cate")) {
                    cate = new Cate();
                    cate.setId(xmlParser.getAttributeValue(0));
                }

                break;
            case XmlPullParser.TEXT:
                // 通过getText()方法获得文本节点的文本值
                String text = xmlParser.getText();
                if (cate != null) {
                 if (tagName.equals("cateurl")) {

                        cate.setCateurl(text);
                    } else if (tagName.equals("catetitle")) {
                        cate.setCatetitle(text);
                    } else if (tagName.equals("catecontent")) {
                        cate.setCatecontent(text);
                    } else if (tagName.equals("cateprice")) {
                        cate.setCateprice(text);
                    }
                }
                break;
            case XmlPullParser.END_TAG:
                Log.i(TAG, "END_TAG");
                tagName = xmlParser.getName();
                if (tagName.equals("cate")) {
                    list.add(cate);
                    cate = null;
                }
                // 每到结束标签需要清空tagName,因为标签与标签之间存在空白的文本结点
                tagName = "";
                break;
            }
            // 触发进入下一次遍历事件
            eventType=xmlParser.next();
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
    return list;
}

2.Sax解析
private static final String TAG=SaxXmlParser.class.getSimpleName();
//用来存存储解析实体类Cate的集合
public List list=null;
private static final String CATE=”cate”;
private static final String CATEURL=”cateurl”;
private static final String CATETITILE =”catetitle”;
private static final String CATECONTENT=”catecontent”;
private static final String CATEPRICE =”cateprice”;

/**
 * sax解析xml数据
 * @param is
 * @return
 */
public List<Cate> saxXmlParser(InputStream is){

    try{
    //先构建sax解析器工厂实例
    SAXParserFactory saxParserFa=SAXParserFactory.newInstance();
    //获取解析器实例
    SAXParser saxParser=saxParserFa.newSAXParser();
    //获取读取事件源实例
    XMLReader xmlReader=saxParser.getXMLReader();
    //构建事件处理器实例
    CateHandler  cateHandler=new CateHandler();
    //将事件处理器设置给事件源
    xmlReader.setContentHandler(cateHandler);
    //通过设置parse()方法注入数据流
    xmlReader.parse(new InputSource(is));
    }catch(Exception e){
        e.printStackTrace();
    }
   return list;
}



/**
 * 定义一个事件处理器
 * @author bee
 *
 */
class CateHandler extends DefaultHandler{
     //美食实体类
    private Cate cate=null;
    //用来存储标签的名称
    private String tagName="";

    //解析到文档开始时触发
    @Override
    public void startDocument() throws SAXException {
        // TODO Auto-generated method stub
        super.startDocument();
         Log.i(TAG, "startDocument");
         list=new ArrayList<Cate>();
    }
   //解析到开始标签时开始触发
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // TODO Auto-generated method stub
        super.startElement(uri, localName, qName, attributes);
        Log.i(TAG, "startElement");
        //获取开始标签名称
        tagName=localName;
        if(CATE.equals(tagName)){
            cate=new Cate();
            cate.setId(attributes.getValue(0));
        }

    }
  //解析到文本节点时开始触发
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        // TODO Auto-generated method stub
        super.characters(ch, start, length);
        Log.i(TAG, "characters");
        //获取文本内容
        String text=new String(ch,start,length);
        if(cate!=null){
            if(CATEURL.equals(tagName)){
                cate.setCateurl(text);
            }else if(CATETITILE.equals(tagName)){
                cate.setCatetitle(text);
            }else if(CATECONTENT.equals(tagName)){
                cate.setCatecontent(text);
            }else if(CATEPRICE.equals(tagName)){
                cate.setCateprice(text);
            }
        }
    }
   //解析到结束标签时候开始触发
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        // TODO Auto-generated method stub
        super.endElement(uri, localName, qName);
        Log.i(TAG, "endElement");
        //获取结束标签名称
        tagName=localName;
        if(CATE.equals(tagName)){
            list.add(cate);
            cate=null;
        }
        //清空tagName,否则标签之间有意义的文本将替换掉原来有意义的数值
        tagName="";
    }

    //解析到文档结束时触发
    @Override
    public void endDocument() throws SAXException {
        // TODO Auto-generated method stub
        super.endDocument();
        Log.i(TAG, "endDocument");
    }

}

3.DOM解析
public List domXmlParser(InputStream is) {
List list = new ArrayList();
Cate cate = null;
try {
//实例化一个文档构建器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//通过文档构建器工厂获取一个文档构建器
DocumentBuilder buidler = factory.newDocumentBuilder();
// 通过文档构建起构建一个文档实例
Document document = buidler.parse(is);
// 从文档中拿到拿到Element
Element element = (Element) document.getDocumentElement();
// 通过标签名拿到元素节点集合 获取所有名字为cate的节点
NodeList nodeList = element.getElementsByTagName(“cate”);
// 遍历节点列表
for (int i = 0; i < nodeList.getLength(); i++) {
// 遍历第一个节点
Element bookElement = (Element) nodeList.item(i);
//实例化封装实体类
cate = new Cate();
//设置cate标签属性
cate.setId(bookElement.getAttribute(“id”));
//获取cate节点包括的子节点列表
NodeList nodesList = bookElement.getChildNodes();
//遍历子节点列表
for (int j = 0; j < nodesList.getLength(); j++) {
//获得节点类型
int nodeEvent=nodesList.item(j).getNodeType();

                if (nodeEvent== Node.ELEMENT_NODE) {
                    //获得节点名字
                    String nodeName = nodesList.item(j).getNodeName();
                    //获得节点内容
                    String text=nodesList.item(j).getFirstChild().getNodeValue();
                    if (nodeName.equals("cateurl")) {
                        cate.setCateurl(text);
                    } else if (nodeName.equals("catetitle")) {
                        cate.setCatetitle(text);
                    } else if (nodeName.equals("catecontent")) {
                        cate.setCatecontent(text);
                    } else if (nodeName.equals("cateprice")) {
                        cate.setCateprice(text);
                    }

                }

            }// end for j
            list.add(cate);
        }//end for i

    } catch (Exception e) {
        e.printStackTrace();
    }
    return list;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Qxiaokang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值