XML解析&DOM4j 解析

解析XML

1.什么是XML?

  • XML指可拓展标记语言
  • XML是一种标记语言,很类似HTML
  • XML的设计宗旨是传输数据,而非显示数据(显示数据应使用HTML及CSS)
  • XML标签没有被预定义 (意味着你可以创建出任何命名的标签,例如<QQ></QQ>,而HTML中并无此标签,但是建议尽可能少的使用中文)

2XML有如下作用:

  • 存储数据
  • 传递数据,即服务器以XML的形式传输数据
  • 软件配置

3JAVA中配置文件的三种配置位置以及读取方式

3.1同包下

 上面是资源文件,现在来读取XML中的数据

 package com.xml;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
 * 配置文件存放的位置
 * 1.同包
 * properties文件也是资源文件的一种
 * @author T440s
 *
 */
public class Dome1 {

	public static void main(String[] args) throws IOException {

		//获取同包下资源文件,将其转换为流
		InputStream ips = Dome1.class.getResourceAsStream("db.properties");

        //使用Properties 帮助类 解析流
		Properties p=new  Properties();
		p.load(ips);//加载流
		String uname = p.getProperty("uname");
		String upass = p.getProperty("upass");
		System.out.println(uname+"--------"+upass);
		
	}
}

3.2根目录下(新建Source Folder文件)

 读取代码

 package com.xml;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
 * 配置文件存放的位置
 * 2.根目录下
 * 读取properties文件
 * @author T440s
 *
 */
public class Dome2 {

	public static void main(String[] args) throws IOException {
		
		
		InputStream ips = Dome1.class.getResourceAsStream("/db.properties");
		Properties p=new  Properties();
		p.load(ips);//加载流
		String uname = p.getProperty("uname");
		String upass = p.getProperty("upass");
		System.out.println(uname+"--------"+upass);
		
	}
}

3.3WIN-INF 安全路径下

package com.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/dome3")
public class pateservlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
			doPost(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
			//首先拿到上下文Context
		ServletContext Context = req.getServletContext();
		InputStream in = Context.getResourceAsStream("/WEB-INF/db.properties");
		Properties p=new Properties();
		p.load(in);
		String uname = p.getProperty("uname");
		String upass = p.getProperty("upass");
		System.out.println(uname+"--------"+upass);
	}
}

打印结果皆为:

mybatis_ssm--------xiaoli

4.dom4j解析

在使用dom4j 解析前,我们还需要下载并导入第三方jar包:dom4j-1.6.1.jar,该包是一种开源的XML解析包。

下载路径:http://www.dom4j.org/dom4j-1.6.1/

xml

<?xml version="1.0" encoding="UTF-8"?>
<students>
	<student sid="s001">
		<name>小明</name>
	</student>
	<student sid="s002">
		<name>小芳</name>
	</student>
	<student sid='s003'>
		<name>小王</name>
	</student>
</students>

解析代码:

package com.xml;

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

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

public class Dome4 {

	public static void main(String[] args) throws DocumentException {
		/**
		 * 现在获取小王这个人名
		 * 步骤:
		 * 1.读取students.xml的xml内容
		 * 2.解析获取到的所有的student标签内容
		 * 3.获取到所有student标签的sid
		 * 4.当sid=s003的时候,获取name标签内容
		 * 
		 */
		//获取xml文件
		InputStream in = Dome4.class.getResourceAsStream("students.xml");
			//xml解析器
			SAXReader sr=new SAXReader();
			//解析XML文件
			Document red = sr.read(in);
			System.out.println("xml文件内容:"+red.asXML());
			//selectNodes获取对应节点对象 返回list
			List<Element> student = red.selectNodes("/students/student");
			for (Element element : student) {
					//获取指定对象的属性值
				String sid = element.attributeValue("sid");
					if("s003".equals(sid)) {
						//selectSingleNode获取对应节点对象单个元素对象
						Element name = (Element)element.selectSingleNode("name");
							String text = name.getText();
							System.out.println("名字:"+text);
					}
			}
	
	}
}

5.xpath解析 

首先导入jaxen-1.1-beta-6.jar jar包, xpath解析是基于dom4j 的;所以还需要导入dom4j jar包

 语法:/ 定位路径 @属性

package com.xml;

import java.io.InputStream;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

public class dome6 {

	public static void main(String[] args) throws DocumentException {
		InputStream in = dome6.class.getResourceAsStream("students.xml");
		//解析器
		SAXReader sr=new SAXReader();
		Document red = sr.read(in);
		
		Element name = (Element) red.selectSingleNode("/students/student[@sid='s002']/name");
			System.out.println("名字:"+name.getText());
	}
}

最后结果:

名字:小芳

案列:

<?xml version="1.0" encoding="UTF-8"?>
	<!--
		config标签:可以包含0~N个action标签
	-->
<config>
	<!--
		action标签:可以饱含0~N个forward标签
		path:以/开头的字符串,并且值必须唯一 非空
		type:字符串,非空
	-->
	<action path="/regAction" type="test.RegAction">
		<!--
			forward标签:没有子标签; 
			name:字符串,同一action标签下的forward标签name值不能相同 ;
			path:以/开头的字符串
			redirect:只能是false|true,允许空,默认值为false
		-->
		<forward name="failed" path="/reg.jsp" redirect="false" />
		<forward name="success" path="/login.jsp" redirect="true" />
	</action>

	<action path="/loginAction" type="test.LoginAction">
		<forward name="failed" path="/login.jsp" redirect="false" />
		<forward name="success" path="/main.jsp" redirect="true" />
	</action>
</config>

 读取代码:

package com.xml;

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

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Dome3 {
public static void main(String[] args) throws DocumentException {
	
	InputStream in = Dome3.class.getResourceAsStream("config.xml");
	SAXReader sr=new SAXReader();
	Document red = sr.read(in);//读取流中的数据
	//1.获取所有action中的type的值
	List<Element> seleNode = red.selectNodes("/config/action");
	for (Element element : seleNode) {
		String type = element.attributeValue("type");
		System.out.println("所有action中的type的值:"+type);
	}
	
	//获取第二个action中的type的值
	
	List<Element> Nodes = red.selectNodes("/config/action[@path='/loginAction']");
	for (Element element : Nodes) {
		String type = element.attributeValue("type");
		System.out.println("第二个action中的type的值:"+type);
	}
	
	//获取第二个action的所有forward的path
	List<Element> Nodess = red.selectNodes("/config/action[@path='/loginAction']/forward");
	for (Element element : Nodess) {
		String path = element.attributeValue("path");
		System.out.println("第二个action的所有forward的path"+path);
	}
	//获取第二个action的第二个forward的path
	
	List<Element> selectNodes = red.selectNodes("/config/action[@path='/loginAction']/forward[@name='success']");
	for (Element element : selectNodes) {
		String path = element.attributeValue("path");
		System.out.println("第二个action的第二个forward的path:"+path);
	}
	
}
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值