XML解析
一,什么是XML
(1)XML,Extensible Markup Language,扩展性标识语言。文件的后缀名为:.xml。就像HTML的作用是显示数据,XML的作用是传输和存储数据。
二,properties文件读取
(1)properties文件的解析我们用一个类完成解析,根据存放位置,
下面我来介绍三个存放位置
1.2.1 src根目录下
Xxx.class.getResourceAsStream("/config.properties");
1.2.2 与读取配置文件的类在同一包
Xxx.class.getResourceAsStream("config2.properties");
1.2.3 WEB-INF(或其子目录下)
ServletContext application = this.getServletContext();
InputStream is =
application.getResourceAsStream("/WEB-INF/config3.properties");
(2)当我的文件在我的根目录下
我们可以这样获取里面的内容 代码如下:
思路:
我们要读取根目录下的资源文件,将当前同包下的db.properties资源文件转换输入流
我们写完读取根目录下的代码之后,我们还有写专门的工具类来讲流中的数据解析出来。
还有一点就是斜杆代表根目录。
package com.tanhaifang; import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;/**
* 读取指定位置下的资源文件(db.properties)
* 1,读取同包下的资源文件
* 2.资源文件存放在根目录下
* 3.资源文件放在web-inf下
*
* 何为 source folder
* 就是代码不将其当作文件来处理,程序员用来做文件归类所用
*
* 程序运行时class文件
* @author Admin
*
*/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"));
}
}
我们获取到的是db.properties的两个值
结果如下:
(3)我们在来试一下与读取配置文件的类在同一包
我们可以这样获取里面的内容 代码如下:
思路:我们要读取同包的资源文件,将当前同包下的db.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"));
}
结果如下:
它也是获取db.properties的两个值
(4)source folder是什么?
就是代码不将其当做文件来处理,程序员用来做文件归类所用.
(5)我们在试一下如果我们把文件放在WEB-INF下面怎么获取里面的内容 代码如下:
思路:我们要用上下文来获取
WEB-INF 它是一个安全的目录,也就是一个不能被外界访问的一个目录,只能通过内部配置web.xml通过servlet来访问。
还有就是资源文件存放在web-inf下 “ 程序运行是class文件”
接下我们下面是写一个servlet,通过application来获取值,
还有配置web.xml,同web来把文件的值打印到控制台。
package com.tanhaifang; 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 ParseSrevlet extends HttpServlet { /**
*
*/
private static final long serialVersionUID = 1L; @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
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"));
}
}
然后写一个web配置
<?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>t226_XML</display-name>
<servlet>
<servlet-name>parseSrevlet</servlet-name>
<servlet-class>com.tanhaifang.ParseSrevlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>parseSrevlet</servlet-name>
<url-pattern>/parseSrevlet</url-pattern>
</servlet-mapping>
</web-app>
结果如下:
三,XML的解析
(1)文件存在的位置来取,是跟Properties是一样的,接下来我们了解一下XML文件里面有一些什么:
下面的代码大概就是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>
(2)我们解析的XML的文件有很多方法,比如:
1, dom4j解析 (由外到内解析,目前最火的解析方式)
dom4j是一个易用的,开源的库,用于XML,XPath和XSLT。它应用于java平台,采用了java集合框架并完全 支持DOM,SAX和JAXP.
2, jdom/ jbk
3, sax解析(由上往下解析,移动端用的比较多)
(3)我们要通过dom4j和xpath解析xml文件,
思路:
第一我们要导入两个jar包dem4和jaxen,
第二我们要来获取sid=s002和name值:
第三我们获取sid=S002和name值有两种方法
代码如下:
import java.util.List;import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;/*
* dom4j
* jdom jbk
* sax解析
* 解析指定路径下的资源文件
*/
public class XMlDemo {
public static void main(String[] args) throws Exception{
InputStream in= XMlDemo.class.getResourceAsStream("students.xml");
SAXReader sa=new SAXReader();
Document doc = sa.read(in);
// System.out.println(doc.asXML());//输出整个xml的文件值
//xpayh解析能够将xml格式的窜当初目录结构进行查找
//获取到所有的文件的值
// List<Element> stuEles = doc.selectNodes("/students/student");//查stu这一组节点
//遍历 这是第一种方法,通过遍历判断
// 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());
// }
//
// }
//第二种方法
Element stuS002Ele = (Element) doc.selectSingleNode("/students/student[@sid='s002']");
System.out.println(stuS002Ele.asXML());
}
}
结果如下:
两种方法的结果都是一样的。
(4)对XML的解析主要的是对每一个元素节点的分析,
下面给大家看两个获取的代码。
代码如下:
document.selectNodes(xpath);//查一组
document.selectSingleNode(xpath);//查单个
四,config.xml解析
1、获取所有action中的type的值
2、获取第二个action中的type的值
3、获取第二个action的所有forward的path
4、获取第二个action的第二个forward的path
首先我们来看一下config.xml案例:
<?xml version="1.0" encoding="UTF-8"?> <config> <action path="/regAction" type="test.RegAction"> <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>
代码如下:
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;/**
* 作业:config.xml解析
1、获取所有action中的type的值
2、获取第二个action中的type的值
3、获取第二个action的所有forward的path
4、获取第二个action的第二个forward的path * @author Admin
*
*/
public class ConfingDemo {
public static void main(String[] args) throws Exception {
InputStream in= ConfingDemo.class.getResourceAsStream("config.xml");
SAXReader sReader=new SAXReader();
Document dct = sReader.read(in);
System.out.println("----这是第一题----");
//1、获取所有action中的type的值
List<Element> stuElem=dct.selectNodes("/config/action");
for (Element stuEle : stuElem) {
String type = stuEle.attributeValue("type");
System.out.println(type);
}
System.out.println("----这是第二题----");
// 2、获取第二个action中的type的值
List<Node> list= dct.selectNodes("/config/action[@path='/loginAction']");
for (Node node : list) {
Element elem=(Element)node;
String type=elem.attributeValue("type");
System.out.println(type);
}
System.out.println("----这是第三题----");
//3、获取第二个action的所有forward的path
List<Node> lis=dct.selectNodes("/config/action[@type='test.LoginAction']/forward");
for (Node node : lis) {
Element ele=(Element)node;
String path=ele.attributeValue("path");
System.out.println(path);
}
System.out.println("---这是第四题----");
// 4、获取第二个action的第二个forward的path
List<Node> lit=dct.selectNodes("config/action[@type='test.LoginAction']/forward[@name='success']");
for (Node node : lit) {
Element eml=(Element)node;
String path=eml.attributeValue("path");
System.out .println(path);
}
}}
结果如下:
上一篇: XML SAX解析
下一篇: 手动生成的蓝屏Dump信息分析