以前都用为知笔记,这次弄这个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,谢谢合作.