Dom解析复杂的Xml(另:getElementsByClassname()和getChildNodes()的应用)

来源:互联网 发布:java opencv 人脸比对 编辑:程序博客网 时间:2024/06/06 09:29
  • 以前都用为知笔记,这次弄这个dom解析实在太麻烦了,弄了好几天才弄明白,网上一直没有复杂一点的例子,所以这次经过测试以后,把这两个函数小说下.大家看到了可以指点一下.

首先适用场景

(可能部分跑题,大家见谅)
我会先贴出网上一个xml文件,这个是比较复杂的,和网络上面的那些例子不一样,我会一层一层说.
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

然后重点就来了,我想要City节点下面的Name,AQi,Color.那么我本来想的是直接用Pull解析(Android中的,我是安卓编程的.),如果人们的xml就是这么简单的话,就不用往下看了,直接去找pull解析教程.

但是这里要说的是,下面的Pointers中有重复的节点!!!直接上图

这里写图片描述
这里写图片描述

然后就是getElementsByClassname()和getChildNodes的应用和区别

在这里就不继续放我这个xml结构的图片了,上面已经说完了.

我先说一下dom解析的小步骤(因为我是自学的,都是我自己总结的,不对别喷我)

        //1.创建Dom工厂对象        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();        //2.获取DocumentBuilder对象        DocumentBuilder builder = factory.newDocumentBuilder();        //3.获取文档对象(大概就是把流改成内容)        Document document = builder.parse(is);        //4.获取文档对象的根节点(最外面的那个节点)        Element root = document.getDocumentElement();        //5.获取根节点下的子节点(所有叫这个名字的元素节点)        NodeList systemNodes = root.getElementsByTagName("System");        //6.遍历所有的System节点        for (int i = 0; i < systemNodes.getLength(); i++) {            //7.这是从所有System节点中抽取每一个System            Element systemNode = (Element) systemNodes.item(i);            //8.这个是每一个System中的子节点            NodeList systemChildNodes = systemNode.getChildNodes();            //9.然后遍历的是每一个Ststem中的子节点            for (int j = 0; j < systemChildNodes.getLength(); j++) {                //10.获得子节点                Node node = systemChildNodes.item(j);                //11.判断node节点是否是元素节点                if (node.getNodeType() == Node.ELEMENT_NODE) {                    //12.把节点转换成元素节点                    Element element = (Element) node;                    //13.判断元素节点是否是需要的元素节点                    if ("Updatetime".equals(element.getNodeName())) {                        ConstantValue.UPDATETIME = element.getFirstChild().getNodeValue();                    }                }            }            //14.把city添加到list集合中        }        is.close();        return citys;
  • 然后切入主题,如果dom解析还有不懂得地方自己上网搜.
    在上面代码中第5步用到了getElementsByClassname(String name).
  • 我经过测试发现,这个是获取一个元素对象(Element )的下面所有叫name的子节点.(上面其实就一个System,所以可以不遍历)
    然后
  • 而getChildNodes()则是获得当前节点下面所有子节点

    举例也就是

    • Citys的话就是获得他的直接子孩子City节点(13个).
    • Citys用 getElementsByClassname(“City”)的话,就包括了每个Pointer下面的City节点(100+个)
  • 上面就是他俩的区别了.不过直接用getChildNodes().获得City的话真实测试是27个,结果是这样的

city长度:#textcity长度:Citycity长度:#textcity长度:Citycity长度:#textcity长度:Citycity长度:#textcity长度:Citycity长度:#textcity长度:Citycity长度:#textcity长度:Citycity长度:#textcity长度:Citycity长度:#textcity长度:Citycity长度:#textcity长度:Citycity长度:#textcity长度:Citycity长度:#textcity长度:Citycity长度:#textcity长度:Citycity长度:#textcity长度:Citycity长度:#text
  • 想了想知道那个getChildNodes()返回的是什么了,记得以前在那个博客上面看到过.
  • 那个是后面的空格和回车
  • 这里就不画图了,也就是这个getChildNodes()返回的值是每一个子节点和子节点后面的空格,再加上一个父节点后面的空格. 13+13+1=27. 我测试了一下别的也是这样
  • 用的时候只要减一在除以2就是全部的子节点了.想只要city的话就这样就行了
Element citys = (Element)cityList.item(0);          NodeList city = citys.getChildNodes();          for (int i=0;i < city.getLength();i++){              //此时的city节点的item上,有的是一个城市的所有数据              Node node = city.item(i);              if (node.getNodeName().equalsIgnoreCase("city")) { //这是一个有效的节点 

PS:我Android是自学的,以前都是做笔记,博客也是第一次写(格式不好请包涵).估计有好多没用的东西,但是整个思路把我遇到的问题都涵盖了.我只是想帮助一些网友,有帮助给个评论,有错误也欢迎指点. 但是说文笔不好什么的,要喷人就请按下Alt+F4,谢谢合作.

0 0
原创粉丝点击