由于工作中基本上用不到xml的解析 ,所以对xml的操作也不是很了解,很早就想学习下,但是又比较懒惰,所以也迟迟未写,今天 静下心来学了一下,根据网上的资料自己敲了段代码, 做了一个解析简单xml的例子,麻雀虽小五脏俱全。 做例子中遇到了很多知识盲点吧,上网查资料也找到了原因,都在这里总结下。
我是用dom4j来解析xml的 ,下面说说我遇到的几个问题吧
1、 什么是Element,什么是Attribute,什么是Node?
Element简单的说就是XML中的一个 完整的标签,Attribute就是标签中的某些属性,而Attribute所在的位置应该是在<here >,不是在<>not here </>,在后者称为值,而Node,说实话我也没有了解的很透彻,网上是这样解释的 ,说NODE是相对TREE这种数据结构而言的。TREE就是由NODE组成,DOM将文档中的所有都看作节点,Element是可以有属性和子节点的node,node包括element、attribute、RootElement、Comment、Namespace、text等。参照下下面的图片。
2 、getText()与getValue()之间的区别, 首先getValue()这个方法是Attribute拥有的,而Element只有getText(),但同时Attribute也拥有getText()这个方法,正常人类的逻辑思维来说getValue()是要获得如上图attribute中id对应的值的,而getText()是获得name中张三,sex中男这里的值的,巧合的是attribute的getText()与getValue()返回的值相同,我猜想可能是attribute中getText()调用的是getValue()方法吧(瞎说的,没有看源码 )。
再说下dom4j中我用到的几个方法吧:
Document :
getRootElement() 无参数,返回xml文档的根元素
Element:
elements() 无参数,返回所有该元素的子元素
attributes() 无参数,返回该元素下的所有属性
getText() 无参数 ,获取<></>之间的文本,包括空格和回车,当<></>之间存在元素时不返回元素中内容。
getName() 返回元素的名称,即上图中的student,name等
Attribute :
getName () 返回属性的名称,即上图中的ID;
getText(),getValue() 返回属性值。
然后就说一说解析xml,其实明白了xml的组成就知道了,解析xml无非就是取到Element和Attribute,最先是要找个入手点,而这个入手点就是rootElement根节点,只要找到根节点再顺藤摸瓜找到attribute和element再调用 getName(),getText(),getValue()就能知道我们想要的值了。
贴上我写的一小段代码:
private void readXML(String xmlPath) throws Exception{ File xmlFile = new File(xmlPath); SAXReader saxReader = new SAXReader(); Document document = saxReader.read(xmlFile); Element rootEle = document.getRootElement(); List<Element> lstElement = rootEle.elements(); for(Element element:lstElement){ List<Attribute> lstAttr = element.attributes(); for(Attribute attr :lstAttr){ System.out.println(attr.getName()+"="+attr.getValue()); } List<Element> lstEle = element.elements(); for(Element attr :lstEle){ System.out.println(attr.getName()+"="+attr.getText()); } } }