XML解析

来源:互联网 发布:mac desktop pictures 编辑:程序博客网 时间:2024/05/18 14:26

1.XML解析

<?xml version="1.0" encoding="utf-8"?><!--首行是xml的声明  --><country name="中国">    <!-- 写在标签内的是标签的属性 -->    <province name="湖南" id="01">        <capital>changsha</capital>        <!-- 写在标签开始结尾内的是标签的文本 -->        <area>30</area>        <population>1000</population>    </province>     <province name="湖北" id="02">        <capital>wuhan</capital>        <area>35</area>        <population>2000</population>    </province>     <province name="广东" id="03">        <capital>广州</capital>        <area>40</area>        <population>3000</population>    </province></country><!-- 这是xml的注释 --><!-- 标签:  xml文件包括标签和属性,标签本身可以有属性,如province的name属性,同时标签可以有子标签,比如province的子标签有capital,area,population等,转义字符:                 <         < >         > "         " &         & 空格      &nsbp; --><!-- CDATA块:作用: 可以让一些需要进行包含特殊字符的内容统一进行原样输出。--><!-- xml解析方法:DOM:Dom4J(使用广泛,不在jdk中,dom4j-1.6.1.jar), JAXP (oracle-Sun公司官方)   DOM解析原理:xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一颗Document的对象树,       通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容。SAX:Sax解析工具(oracle-sun公司官方)-->    


package p01;import java.io.File; import java.util.Iterator;import java.util.List; import org.dom4j.Attribute;import org.dom4j.Element;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Node;import org.dom4j.io.SAXReader;public class Demo1 {public static void main(String[] args) throws DocumentException {//showXml();//showXmlParams();//showXmlAttr();//showXmlEle();//showXmlAll();//SAXReader reader = new SAXReader();//Document document = reader.read(new File("./src/country.xml"));//Element rootEle  = document.getRootElement();//getNodes(rootEle);showAll();}private static void showAll() throws DocumentException {SAXReader reader = new SAXReader();Document document = reader.read(new File("./src/country.xml"));Iterator<Element> it = document.getRootElement().elementIterator("province");while(it.hasNext()){Element ele = it.next();Province pro = new Province();pro.setCapital(ele.elementText("capital"));pro.setArea(ele.elementText("area"));pro.setPopulation(ele.elementText("population"));System.out.println(pro.toString());}}/** * 递归显示所有的节点 * */private static void getNodes(Element ele) { System.out.println(ele.getName()+"###"+ele.getText());Iterator<Node> it = ele.nodeIterator();while(it.hasNext()){Node node =  it.next();if(node instanceof Element){getNodes((Element)node);}}}/** * 显示所有的节点 * 节点node分为标签(Element,)属性,文本,只有标签包含子节点,其余两个没有 * */private static void showXmlAll() throws DocumentException {SAXReader reader = new SAXReader();Document document = reader.read(new File("./src/country.xml"));Iterator<Node> it  = document.nodeIterator();while(it.hasNext()){Node node = it.next();System.out.println(node.getName()+"!!!!" +node.getText() );}}/** * 获取xml文件的节点标签 * 获取节点之后,才能进一步获取对应的属性,文本(无子标签时一般包含文本值) * @throws DocumentException  * */private static void showXmlEle() throws DocumentException { SAXReader reader = new SAXReader();Document document = reader.read(new File("./src/country.xml"));Element rootEle  = document.getRootElement();System.out.println("根标签的名字:"+rootEle.getName());//得到根标签下的指定名称的第一个子标签Element ele1 = rootEle.element("province");System.out.println(ele1.elementText("capital")+"--"+ele1.elementText("area")+"--"+ele1.elementText("population"));System.out.println("-----------------");//得到根标签下的指定名称的所有子标签Iterator<Element> it = rootEle.elementIterator();while(it.hasNext()){Element ele = it.next();System.out.println(ele.elementText("capital")+"--"+ele.elementText("area")+"--"+ele.elementText("population"));}System.out.println("-------------");//得到根标签下的所有子标签    List<Element> list = rootEle.elements();    for (Element element : list) {System.out.println(element.getName());}    System.out.println("-----------------");    //链式获取深层标签    Element ele3 = rootEle.element("province").element("population");    System.out.println(ele3.getName()+"--"+ele3.getText());}/** * 获取属性, * 获取属性前要先获取对应的节点标签 * */private static void showXmlAttr() throws DocumentException {SAXReader reader = new SAXReader();Document document = reader.read(new File("./src/country.xml"));Element ele1 = document.getRootElement().element("province");//方法1,直接获取节点的属性值String str1 = ele1.attributeValue("name");String str2 = ele1.attributeValue("id");System.out.println("方法1:"+str1 +"--------" +str2);//方法2,根据属性名获取属性对象,得到属性的属性名和属性值Attribute attr1 = ele1.attribute("name");String key1 = attr1.getName();String value1 = attr1.getValue();System.out.println("方法2:"+key1 +"--------" +value1);//方法3,得到所有属性对象返回List集合List<Attribute> list = ele1.attributes(); System.out.println("------方法3--------");for (Attribute att : list) {System.out.println(att.getName()+"=="+att.getValue());}//方法4,得到所有属性对象返回迭代器Iterator<Attribute> it = ele1.attributeIterator();System.out.println("------方法4--------");while(it.hasNext()){Attribute attr2 = it.next();System.out.println(attr2.getName()+"=="+attr2.getValue());}}/** * 获取文本 * 获取文本前先获取对应的节点标签 * */private static void showXmlParams() throws DocumentException   { SAXReader reader = new SAXReader();Document document = reader.read(new File("./src/country.xml"));//Element ele =  document.getRootElement().getText();String  text =  document.getRootElement().getText();//System.out.println("text1:" + text1);Element rootEle =  document.getRootElement();//获取元素的文本,//根据元素名称获取节点,默认获取第一个Element ele1 = rootEle.element("province");String capital_1 = ele1.element("capital").getText();String area_1 = ele1.element("area").getText();String population_1 = ele1.elementText("population");//elementText相当于element()和getText()两个方法的结合System.out.println(capital_1 + "---" + area_1 + "---" + population_1); }/** * 获取文档树对象 * */private static void showXml() throws DocumentException { SAXReader reader = new SAXReader();Document document = reader.read(new File("./src/country.xml"));System.out.println(document);}}
总结:
xml的dom解析方法,操作类型分为节点,标签,属性,文本,后三者统称为节点,只有标签可以有子节点,其余二者不可以有子节点;
                             操作节点:可以通过获取节点的迭代器来遍历
                             操作标签:可以获取指定名称的第一个标签,也可以获取指定名称的所有标签
                             操作属性:通过标签获取其属性,可以通过属性名称获取,也可以先获取属性对应,在获取属性名和属性值,
                             操作文本:可以通过标签获取文本,也可以通过标签名字直接获取标签的文本
原创粉丝点击