大家好,我们之前已经讲了SAX解析和PULL解析,今天我们来讲一下最后一种方式:DOM方式解析xml。
同样我们还是先准备一下我们的数据。
这是我们今天要使用的字符串,没错,我在以前的基础上又加了一个presdent(没错就是恶搞-。-)。
然后开始我们解析过程:
1.创建dom的解析器工厂,
2.创建dom解析器
3.获取用dom解析器获取整个文档,将整个文档读入内存。
第一行是懒人方法,相信大家可以看懂,下面三行是正规的逻辑。
4.获取标签集合,我们通过getElementsByTagName方法获取。
这个方法传入的参数就是我们写的标签名字,他返回的是一个NodeList集合类型。我们的asd.xml中,school标签内的内容有presdent标签和class标签,所以我们可以添加这两个名字。
从简单开始,我们就先添加presdent吧。
因为presdent只有一个,所以我直接用item(0)获取第一个元素,也就是获取仅有的一个presdent了。
到这里,我先给大家说一些基础东西和DOM的api中常用的一些方法:
我们总说标签名,属性,文本,内容,这些专业名字我们今天具体罗列一下:
上面这张图片已经说得很清楚了,大家体会一下(不要注意美观)。
然后我们来看一下一些重要的方法:
document.getElementByTagName(String ) 这个方法是从我们读取到的文档对象中获取标签集合,具体获取什么样标签由String决定。
nodeList.item(int) 获取标签集合对应的元素
node.getAttribute();获取节点标签的属性,由NamedNodeMap 接收。
node.getNodeType();获取节点的类型,我们一般用这个方法来判断当前节点是否是标签类型,一般和Node.ELEMENT_NODE比较判断是否是标签节点。
node.getNodeName();获取节点名字,例如上面的presdent,name,id,sex,class。
node.getTextContent();获取文本数据,这个跟上图对照应该都能知道什么意思了吧。
node.getChildNodes();获取节点标签的子节点。student的子节点标签就是name,id,sex。
一般常用到的就这几个方法,接下来我们继续看。
5.我们刚才获取到了presdent标签节点。我们发现这个标签没有属性,那么我们就跳过,直接获取他的内容节点了。
然后我们还需要一个PresdentBean类。
新建一个PresdentBean对象。用来接收数据。
我们进行了简单的if判断,让他给对应的属性赋予对应的文本数据(所以我们用getTextContent),
现在我们来一个简单的日志,看一看数据是不是已经获取到了。
看来我们已经成功的解析了presdent的xml数据。
那接下来我们看class这个比较难得,其实他也不是很难,标签嵌套标签。但是这里面有一个坑,我还是想想给大家说一下,以免一些懒人想偷工减料,结果。。。。
这里 有一个DOM中常见的陷阱,比如我们在调用node.getChildNodes方法,集合中除了我们的标签节点,还有上述所谓的文本节点,而且他经常是以#text等形式出现的。
他在我们进行操作时候,一旦出现多重嵌套,肯定会有多重循环,那么它就会使数据层次、内容错误。
为了避免这个方法,我们只需要在我们获取节点之后,来判断一下当前节点是否是标签(通过node.getNodeType方法)。
好了,接下来我们一起来解析下面的数据。
比较恶心的XML数据解析
上述1-3步骤就不重复了,我们直接进行。
首先获取class标签集合,然后循环遍历,在循环中我们获取了当前子节点,并且判断了当前节点是否是标签类型。
给id属性赋值。
我们又获取了classNode下的子节点集合,遍历,创建studentBean对象,添加判断。
因为student下还有内容,也还有标签,所以我们在加一重循环,这次用来获取到内容值。我们看一下日志:
看来我们也成功获取到了class下面这个复杂的数据。
至于给bean类赋值,就交给大家来进行吧。毕竟每个人的逻辑都不一样嘛。
网友评论