XML解析

XML的用途

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

静态资源文件

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

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

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

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

下图是配置文件的信息
XML解析_第1张图片
读取代码如下:

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"));
	}
}

控制台显示如下:
XML解析_第2张图片
方法②:资源文件存放在根目录下

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

下图是配置文件的信息
XML解析_第3张图片
读取代码如下:

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"));
	}
}

控制台显示如下:
XML解析_第4张图片

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配置:



  1_xml
 
	ParseServlet
 	com.lijiaxue.parse.ParseServlet
 
 
 	parseServlet	
	parseServlet
 

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

解析的包:

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

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

资源文件的内容如下



	
		小明
	
	
		小芳
	
	
		小王
	

(全部获取)解析代码如下:

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());

	}
	}
	

控制台显示如下:
XML解析_第5张图片
(只获取小芳的信息)方法一(慢)如下:

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 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());
			}
		}
	}
	}
	
**控制台显示如下**

XML解析_第6张图片

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

  • 需要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());
	}
	}
	

控制台显示如下:
XML解析_第7张图片

以上内容的总结:

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

  • 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’]

你可能感兴趣的:(XML解析)