浅谈xml解析

来源:互联网 发布:js div滑动效果 编辑:程序博客网 时间:2024/06/06 03:59
java中的xml解析,我们可以用dom解析,dom解析,dom解析把整个xml文档按照树形的缩进结构来解析的,一般,使用dom解析的时候,我们需要拿到dom解析器,并且拿到xm树的根节点,然后,在其中找到我们所需要的信息,当然,java中domApi给我们提供了非常方便的获取一些信息的接口:
dom解析流程,总结一下:
1,拿到dom解析器
->要用的接口是documentBuilder,documentBuilderFactory,Document;
2,获取dom根节点
->要用的接口是document.getDocumentElement();
3,获取我们需要的信息
->getElementByTagName();获取的是我们所需要的根节点下的所有信息
->getAttributes(),获取节点中的所有属性,他的返回值是NamedNodeMap,这时候,我们可以直接拿到相应的属性的值了,注意,dom的属性也是Node节点,通过getNodeValue()获取值;
-------------------------------------------------------dom获取信息,示例---------------------------------------------------------
=======获取dom
public Document getDocument(InputStream in)
    {
        Document dom = null;
        try
        {
            DocumentBuilderFactory factory = DocumentBuilderFactory
                    .newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            dom = builder.parse(in);
            return dom;
        } catch (Exception exp)
        {
            exp.printStackTrace();
        } finally
        {
            // 必要的时候要用
        }
        return null;
    }
========获取rootNode
public Element getRootNode(Document dom)
    {
       
        if (null == dom)
        {
            return null;
        }
       
        Element root = dom.getDocumentElement();
        return root;
       
    }
==========获取xml中的所有节点信息
private void xmlToString(Node node)
    {
           
        if (Node.ELEMENT_NODE == node.getNodeType())
        {
            NodeList list = node.getChildNodes();
            int depth = list.getLength();
            Node firstNode = list.item(0);
            if (depth == 1 && firstNode.getNodeType() == Node.TEXT_NODE)
            {
                buffer.append(firstNode.getNodeValue());
                buffer.append("\n");
            }
            else
            {
                buffer.append(node.getNodeName());
                buffer.append("\n");
                NamedNodeMap map = node.getAttributes();
                 if ("student".equals(node.getNodeName()))
                 {
                  buffer.append(map.getNamedItem("name").getNodeValue());
                  buffer.append("....");
                  buffer.append(map.getNamedItem("sex").getNodeValue());
                  buffer.append("....");
                  buffer.append(map.getNamedItem("age").getNodeValue());
                  buffer.append("....");
                  buffer.append("\n");
                 }
                for (int i = 0; i < depth; i++)
                {
                    xmlToString(list.item(i));
                }
               
            }
        }
    }
-----------------------------------Android平台pull解析-------------------------
andorid平台,我们解析xml可以用pull解析,pull解析采用的事件驱动解析,也就是,整个文档有start和end之分,每一个标记也有start之分,碰到一个标记的时候,我们只需要处理我们需要的数据,其他数据不用关心,示例如下:
public String pullParser(InputStream in)
    {
        try
        {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser parsre = factory.newPullParser();
            parsre.setInput(in, "utf-8");
            int eventType = parsre.getEventType();
            while(XmlPullParser.END_DOCUMENT != eventType)
            {
                switch(eventType)
                {
                    case XmlPullParser.START_DOCUMENT:
                    {
                        //解析文档之前,需要的一些准备工作在这里做
                        break;
                    }
                    case XmlPullParser.START_TAG:
                    {
                        //获取我们关心的节点数据
                        if("ban".equals(parsre.getName()))
                        {
                            buffer.append("node..name..ban:"+parsre.getAttributeValue(0));
                            buffer.append("\n");
                        }
                        if("name".equals(parsre.getName()))
                        {
                            buffer.append("node..name..name:"+parsre.nextText());
                            buffer.append("\n");
                        }
                        break;
                    }
                    case XmlPullParser.END_TAG:
                    {
                        //处理一些要获取的数据节点的收尾工作
                        break;
                    }
                }
                eventType = parsre.next();
            }
           
        }
        catch(Exception exp)
        {
            exp.printStackTrace();
        }
        return new String(buffer);
    }
原创粉丝点击