10分钟掌握XML、JSON及其解析(4)

DOM把XML文档作为树结构来查看。能够通过DOM树来访问所有元素。可以修改或删除它们的内容,并创建新的元素。元素,它们的文本,以及它们的属性,都被认为是节点。

XML DOM是:

用于XML的标准对象模型

用于XML的标准编程接口

中立于平台和语言

W3C的标准

XML DOM定义了所有XML元素的对象和属性,以及访问它们的方法(接口)。

换句话说:

XML DOM是用于获取、更改、添加或删除XML元素的标准

DOM将XML文档作为一个树形结构,而树叶被定义为节点。

1.6.2 总结

XML DOM其实比较复杂,在这么短的篇幅里也无法一一进行讲解。想详细了解XML DOM可以好好去学习下

1.7 XML如何解析?

上面讲了这么多关于XML的东西,那么XML文件应该如何解析呢?

终于到了我们的重头戏了

下面以视频项目为例,展示如何解析XML文件:

1.7.1 Step 1

XML文件是一棵树,首先需要找到对应的节点,然后从节点开始解析,比如搜索找到的就是result/weights/weight 和result/weights/weight 2个节点,分别从这个开始解析:

public ResultInfo onParser(Element rootElement) { int resp = -1; try { String elName = "header/respcode"; resp = Integer.parseInt(selectNodeString(rootElement, elName)); } catch (NumberFormatException e) { e.printStackTrace(); } Log.d(TAG, "resp= " + resp); if (resp != 0) { return null; } ResultInfo searchResultInfo = new ResultInfo(); // Parse Search Weight @SuppressWarnings("rawtypes") final List weights = rootElement.selectNodes(rootElement.getPath() + "https://www.jb51.net/" + "result/weights/weight"); ResultInfo[] resultFilterInfos = parseVideos(weights); if (resultFilterInfos != null) { ResultInfo weight = new ResultInfo(); weight.putResultInfoArray(ResultInfo.KEY_VIDEOS, resultFilterInfos); searchResultInfo.putResultInfo(ResultInfo.KEY_WEIGHT, weight); } // Parse Albums @SuppressWarnings("rawtypes") final List albums = rootElement.selectNodes(rootElement.getPath() + "https://www.jb51.net/" + "result/albums/album"); ResultInfo[] resultInfos = parseVideos(albums); if (resultInfos != null) { ResultInfo album = new ResultInfo(); album.putResultInfoArray(ResultInfo.KEY_VIDEOS, resultInfos); searchResultInfo.putResultInfo(ResultInfo.KEY_SEARCH, album); } return searchResultInfo; }

1.7.2 Step 2

 找到了对应的Node,即从对应的Node开始递归的查找,直到找到最小的节点,也就是最基本的单元Element。再对每一个Element进行解析:

private ResultInfo[] parseVideos(final List nodes) { if (nodes != null && nodes.size() > 0) { final int size = nodes.size(); final ResultInfo[] vis = new ResultInfo[size]; int i = 0; for (Object o : nodes) { if (o instanceof Element) { final Element videoElement = (Element) o; ResultInfo vi = parseVideo(videoElement); vis[i] = vi; } i++; } return vis; } return null; }

1.7.3 Step 3

 针对获取到的Element,解析出对应的String将数据传递给VideoInfo这个类:

private ResultInfo parseVideo(final Element videoElement) { final String id = videoElement.elementText("album_id"); final String title = videoElement.elementText("title"); final String categoryId = videoElement.elementText("category_id"); final String categoryName = videoElement.elementText("category_name"); final String count = videoElement.elementText("count"); final String imgUrl = videoElement.elementText("img180236"); final String duration = videoElement.elementText("duration"); final String mainactors = videoElement.elementText("mainactors"); final String sitename = videoElement.elementText("site_name"); final String videourl = videoElement.elementText("vedio_url"); final String sort = videoElement.elementText("sort"); final String tv_id = videoElement.elementText("tv_id"); ResultInfo vi = new ResultInfo(); vi.putString(VideoInfo.ID, id); vi.putString(VideoInfo.TITLE, title); vi.putString(VideoInfo.CATEGORY_ID, categoryId); vi.putString(VideoInfo.CATEGORY_NAME, categoryName); vi.putString(VideoInfo.COUNT, count); vi.putString(VideoInfo.IMG_URL, imgUrl); vi.putString(VideoInfo.DURATION, duration); vi.putString(VideoInfo.MAINACTORS, mainactors); vi.putString(VideoInfo.SITENAME, sitename); vi.putString(VideoInfo.VIDEOURL, videourl); vi.putString(VideoInfo.SORT, sort); vi.putString(VideoInfo.TV_ID, tv_id); return vi; }

1.7.4 Step 4

 当使用XML解析器将XML数据解析出来之后。需要将这些数据提取出来,也是通过连续2层提取,将数据定位到每个video, 将每个video里的数据传递给SearchVideoInfo这个ArrayList,然后将ArrayList中的数据和对应的Adapter数据关联起来:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzdysx.html