xml书写规范及解析

本文探讨了XML的书写规范,结合示例文件books.xml,深入讲解了如何使用DOM4J库进行XML解析,并介绍了XPath表达式在XML数据查找中的应用。
xml书写规范
     1.xml不区分大小写,但是XML大写敏感。
     2.xml标签不能使用关键字,例如 XML  version
     3.正确嵌套
     4.不能以数字开头
     5.只能有一个根标签
当服务器传输过来的数据结构为xml,需要解析xml结构,帮数据获取到
解析xml技术
jaxp:sun公司出品,sun公司自己内部的员工不用
jdom解析:开源社区大牛创建出来的,风靡全球
dom4j(dom for java):当今最火的解析技术。******    dom for java   i18n  i...n log4j     
XPath技术
DOM4J为了让解析XML更加方便采用的全局搜索这么一个功能,需要导包
XPath依赖dom4j技术。
    
doc.selectNodes(表达式):检索节点返回集合
doc.selectSingleNode():检索节点返回单个对象
    
xpath需要行使用dom4j获取当前的doc对象。

例题(记得导包):
books.xml:

<?xml version="1.0" encoding="UTF-8"?>
<books>
	<book xh = "1">
		<book_name bm="文学经典">红楼梦</book_name>
		<book_author>曹雪芹</book_author>
		<book_price>500</book_price>	
	</book>
	<book xh = "2">
		<book_name bm="童年经典">西游记</book_name>
		<book_author>吴承恩</book_author>
		<book_price>600</book_price>	
	</book>
	<book xh = "3">
		<book_name bm="教育资料">坏蛋是怎么样练成的</book_name>
		<book_author>六道</book_author>
		<book_price>1000</book_price>	
	</book>
	
</books>

dom4j:
在这里插入图片描述

package text.dom4j;

import java.io.InputStream;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Before;
import org.junit.Test;

public class Dom4j {
	SAXReader reader = null;
	Document doc = null;
	
	@Before
	public void bf() throws Exception {
		//定义解析器
		reader = new SAXReader();
		InputStream is = Dom4j.class.getClassLoader().getResourceAsStream("books.xml");
		//System.out.println(is);
		//获取当前文件的文档对象
		doc = reader.read(is);
		
		
		
	}
	/*
	 * 获取根节点:books
	 * */
	@Test
	public void method01() {
		//根节点对象
		Element root = doc.getRootElement();
		String name = root.getName();
		System.out.println(name);
		
	}
	/*
	 * 获取根节点下的子节点
	 * book
	 * xh...1
	 * 1
	 * ----------------------------
	 * book
	 * xh...2
	 * 2
	 * ----------------------------
	 * book
	 * xh...3
	 * 3
	 * ----------------------------
	 * */
	@Test
	public void method02() {
		Element root = doc.getRootElement();
		//获取到所有子节点
		List<Element> elements = root.elements();
		for(Element e : elements) {			
			System.out.println(e.getName());
			Attribute attr = e.attribute(0);
			System.out.println(attr.getName()+"..."+attr.getValue());
			
			//直接根据属性名称获取值
			String val = e.attributeValue("xh");
			System.out.println(val);
			System.out.println("----------------------------");
		}
		
	}
	/*
	 * 获取书名
	 * 3
	 * 红楼梦
	 * 文学经典
	 * 曹雪芹
	 * 500
	 * 3
	 * 西游记
	 * 童年经典
	 * 吴承恩
	 * 600
	 * 3
	 * 坏蛋是怎么样练成的
	 * 教育资料
	 * 六道
	 * 1000
	 * */
	@Test
	public void method03() {
		Element root = doc.getRootElement();
		//获取到所有子节点
	    List<Element> elements = root.elements();
	    for(Element et : elements) {
	    	String attr = et.getName()+"..."+et.attribute(0).getName()+"..."+et.attribute(0).getValue();
	    	//获取每个 book的子节点
	    	List<Element> list = et.elements();
	    	System.out.println(list.size());
	    	//遍历book的子节点
	    	for(Element e : list) {
	    		//获取当前标签的文字信息
	    		String str = e.getText();
	    		System.out.println(str);
	    		String val = e.attributeValue("bm");
	    		//System.out.println(val);
	    		if(val!=null) {
	    			System.out.println(val);
	    		}
	    		
	    		
	    	}
	    }
		
	}

}

XPath:
在这里插入图片描述

package text.dom4j;

import java.io.InputStream;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Before;
import org.junit.Test;

public class TestXpath {
	
	SAXReader reader = null;
	Document doc = null;
	
	@Before
	public void bf() throws Exception {
		//定义解析器
		reader = new SAXReader();
		InputStream is = Dom4j.class.getClassLoader().getResourceAsStream("books.xml");
		//System.out.println(is);
		//获取当前文件的文档对象
		doc = reader.read(is);
		
		
		
	}
	/*
	 * 根据当前标签的路径取值
	 * 红楼梦
	 * 西游记
	 * 坏蛋是怎么样练成的
	 * */
	@Test
	public void method() {
		//重要就是表达式
		List<Element> selectNodes = doc.selectNodes("/books/book/book_name");
		for(Element e : selectNodes) {
			System.out.println(e.getText());
		}
	}
	/*
	 * 根据当前标签的路径取值
	 * 更简单的方式
	 * 红楼梦
	 * 西游记
	 * 坏蛋是怎么样练成的
	 * */
	@Test
	public void method02() {
		//重要就是表达式
		List<Element> selectNodes = doc.selectNodes("//book_name");
		for(Element e : selectNodes) {
			System.out.println(e.getText());
		}
	}
	/*
	 * 获取书名+作者+价钱
	 * 9
	 * 红楼梦
	 * 曹雪芹
	 * 500
	 * 西游记
	 * 吴承恩
	 * 600
	 * 坏蛋是怎么样练成的
	 * 六道
	 * 1000
	 * */
	@Test
	public void method03() {
		//重要就是表达式
		List<Element> selectNodes = doc.selectNodes("//book/*");
		System.out.println(selectNodes.size());
		for(Element e : selectNodes) {
			System.out.println(e.getText());
		}
	}

	/*
	 * book下的第二个元素
	 * 3
	 * 曹雪芹
	 * 吴承恩
	 * 六道
	 * */
	@Test
	public void method04() {
		//重要就是表达式
		List<Element> selectNodes = doc.selectNodes("//book/*[2]");
		System.out.println(selectNodes.size());
		for(Element e : selectNodes) {
			System.out.println(e.getText());
		}
	}
	
	
	
	/*
	 * 获取书的别名
	 * 3
	 * 文学经典
	 * 童年经典
	 * 教育资料
	 * */
	@Test
	public void method05() {
		//重要就是表达式
		List<Element> selectNodes = doc.selectNodes("//book/*[1][@bm]");
		System.out.println(selectNodes.size());
		for(Element e : selectNodes) {
			System.out.println(e.attributeValue("bm"));
		}
	}
	/*
	 * 获取书的别名为教育资料
	 * 坏蛋是怎么样练成的
	 * */
	@Test
	public void method06() {
		//重要就是表达式
		/*List<Element> selectNodes = doc.selectNodes("//book_name[@bm='教育资料']");
		System.out.println(selectNodes.size());
		for(Element e : selectNodes) {
			System.out.println(e.attributeValue("bm"));
		}*/
		Node node = doc.selectSingleNode("//book_name[@bm='教育资料']");
		System.out.println(node.getText());
	}
	/*
	 * 总共多少本书
	 * 3
	 * */
	@Test
	public void method07() {
		System.out.println(doc.selectNodes("//book").size());
		
	}
	
	

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值