XML解析

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解析方法,操作类型分为节点,标签,属性,文本,后三者统称为节点,只有标签可以有子节点,其余二者不可以有子节点;
                             操作节点:可以通过获取节点的迭代器来遍历
                             操作标签:可以获取指定名称的第一个标签,也可以获取指定名称的所有标签
                             操作属性:通过标签获取其属性,可以通过属性名称获取,也可以先获取属性对应,在获取属性名和属性值,
                             操作文本:可以通过标签获取文本,也可以通过标签名字直接获取标签的文本
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值