XML解析

XML的用途

http://www.w3school.com.cn/xml/xml_usedfor.asp
①:能够作为一个数据传输的载体
②:可以做配置

静态资源文件

  • XML又被称作静态资源的文件
  • 静态资源文件就是那种可以设置文本记录一些配置的东西
  • 静态资源文件最常见的有两种,一种是properties文件还有就是xml文件形式

如何获取指定位置下的资源文件?有①②③种方法:

方法①:读取同包下的资源文件

  • 方法:流对象=当前类.class.getResourceAsStream(“输入你要读取的文件”)
  • 用专门的工具类 properties 将流对象的数据解析出来
  • 再把数据放到工具类对象中去

下图是配置文件的信息
在这里插入图片描述
读取代码如下:

package com.lijiaxue.parse;

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

public class PropertiesDemo {
	public static void main(String[] args) throws IOException {
//获取同包下的资源文件,将其转化成流对象
		InputStream in = PropertiesDemo.class.getResourceAsStream("db.properties");
//需要专门的工具类来将流中的数据解析出来
		Properties p=new Properties();
		p.load(in);
		System.out.println(p.getProperty("uname"));
		System.out.println(p.getProperty("upass"));
	}
}

控制台显示如下:
在这里插入图片描述
方法②:资源文件存放在根目录下

  • 在src下面建一个原文件夹把资源文件放进去
  • 方法:流对象=当前类.class.getResourceAsStream("/根路径")
  • 用专门的工具类 properties 将流对象的数据解析出来
  • 再把数据放到工具类对象中去

下图是配置文件的信息
在这里插入图片描述
读取代码如下:

package com.lijiaxue.parse;

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

public class PropertiesDemo {
	public static void main(String[] args) throws IOException {
		InputStream in = PropertiesDemo.class.getResourceAsStream("/db.properties");
		Properties p=new Properties();
		p.load(in);
		System.out.println(p.getProperty("uname"));
		System.out.println(p.getProperty("upass"));
	}
}

控制台显示如下:
在这里插入图片描述

source folder是什么?

  • 就是代码不将其当做文件来处理,程序员用来做文件归类所用

方法③:资源文件存放在web-inf下 “ 程序运行是class文件”

  • 把资源文件存放到web-inf下面
  • 创建一个servlet类 继承于httpServlet

代码如下:

package com.lijiaxue.parse;

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

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

public class ParseServlet 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 {
		ServletContext context = req.getServletContext();
		InputStream in = context.getResourceAsStream("/WEB-INF/db.properties");
		Properties p=new Properties();
		p.load(in);
		System.out.println(p.getProperty("uname"));
		System.out.println(p.getProperty("upass"));
	
	}
}

servlet配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>1_xml</display-name>
 <servlet>
	<servlet-name>ParseServlet</servlet-name>
 	<servlet-class>com.lijiaxue.parse.ParseServlet</servlet-class>
 </servlet>
 <servlet-mapping>
 	<servlet-name>parseServlet</servlet-name>	
	<url-pattern>parseServlet</url-pattern>
 </servlet-mapping>
</web-app>

解析指定路径下的资源文件

解析的包:

  • dom4j (最流行)
  • jdom jdk (麻烦)
  • sax解析 (麻烦)

这个方式跟以上两种差不多 但是不同点①工具是SAXReader ②开始是.load 在这里是.read ③返回一个dom4j下的Document对象

资源文件的内容如下

<?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.lijiaxue.parse;

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

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

public class XmlDemo {
	public static void main(String[] args) throws Exception {
		InputStream in = XmlDemo.class.getResourceAsStream("students.xml");
		SAXReader saxReader= new SAXReader();
		Document doc = saxReader.read(in);
		System.out.println(doc.asXML());

	}
	}
	

控制台显示如下:
在这里插入图片描述
(只获取小芳的信息)方法一(慢)如下:

package com.lijiaxue.parse;

import java.io.InputStream;
import java.util.Iterator;
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 XmlDemo {
	public static void main(String[] args) throws Exception {
		InputStream in = XmlDemo.class.getResourceAsStream("students.xml");
		SAXReader saxReader= new SAXReader();
		Document doc = saxReader.read(in);
		List<Element> stuEles = doc.selectNodes("/students/student");
		for(Element stuEle:stuEles) {
			if("s002".equals(stuEle.attributeValue("sid"))) {
				System.out.println(stuEle.asXML() );
				Element nameEle = (Element) stuEle.selectSingleNode("name");
				System.out.println(nameEle.asXML());
				System.out.println(nameEle.getText());
			}
		}
	}
	}
	
**控制台显示如下**

在这里插入图片描述

(只获取小芳的信息)方法二(快)如下:

  • 需要xpath解析:可以将xml格式的串当作目录结构来进行查找
package com.lijiaxue.parse;

import java.io.InputStream;
import java.util.Iterator;
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 XmlDemo {
	public static void main(String[] args) throws Exception {
		InputStream in = XmlDemo.class.getResourceAsStream("students.xml");
		SAXReader saxReader= new SAXReader();
		Document doc = saxReader.read(in);
		Element stuS002Ele = (Element) doc.selectSingleNode("/students/student[@sid='s002']");
		System.out.println(stuS002Ele.asXML());
	}
	}
	

控制台显示如下:
在这里插入图片描述

以上内容的总结:

如何读取指定位置下的资源文件?

  • src根路径下
    类名.class.getResourceAsSteam("/文件名");
  • 同包下
    类名.class.getResourceAsSteam(“文件名”);
  • WEB-INF下面
    ServletContext context = req.getServletContext();
    context.getResourceAsSteam("/WEB-INF/文件名");

读取到资源文件后,如何进行解析?
List list = selectNodes(“节点路径”) E:\2019_y2_讲课\T226\3、XML(3)\3、xml建模
Node node = selectSingleNode查询单个
/students/student[@id=‘s002’]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值