XML解析
一:Java中配置文件的三种配置位置及读取方式
1.1 XML和*.properties(属性文件)
1.2 存放位置
1.2.1 src根目录下
Xxx.class.getResourceAsStream("/config.properties");
如图
这是在src的根目录
以下db.properties配置文件自定义代码(只声明一次)
uname=mybatis_ssm
upass=xiaoli
url=jdbc:mysql://localhost:3306/mybatis_ssm
class=com.mysql.jdbc.Driver
initPoolSize=5
maxPoolSize=20
读取代码如下:
package com.xwt.parse;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* 读取项目根路径下的配置文件
*
*/
public class Demo2 {
public static void main(String[] args) throws Exception {
//读取项目根路径下的配置文件
InputStream in=Demo2.class.getResourceAsStream("db.properties");
Properties p=new Properties();
//将读取的配置文件对应的流对象交给Properties
p.load(in);
System.out.println("uname:"+p.getProperty("uname"));
System.out.println("upass:"+p.getProperty("upass"));
System.out.println("class:"+p.getProperty("class"));
}
}
运行图为下图
1.2.2 与读取配置文件的类在同一包
Xxx.class.getResourceAsStream("config2.properties");
同一级别
提示:db.properties文件在上面已声明
代码如下:
package com.xwt.parse;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* 读取同级目录下的配置文件
*
*/
public class Demo1 {
public static void main(String[] args) throws Exception {
//读取同级目录下的配置文件
InputStream in=Demo1.class.getResourceAsStream("db.properties");
Properties p=new Properties();
//将读取的配置文件对应的流对象交给Properties
p.load(in);
System.out.println("uname:"+p.getProperty("uname"));
System.out.println("upass:"+p.getProperty("upass"));
}
}
如下图:同是src根目录下但是未加/则会报空指针异常
1.2.3 WEB-INF(或其子目录下)
ServletContext application = this.getServletContext();
InputStream is = application.getResourceAsStream("/WEB-INF/config3.properties");
WEB-INF是服务器的安全目录
a.把案例文件放入WEB-INF演示
b.创建DemoServlet.java
c.把项目加入,配置,运行
如图
代码如下:
package com.xwt.parse;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.jws.WebService;
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("/demo3")
public class DemoServlet 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 {
//获取web-inf下的配置文件
InputStream in=req.getServletContext().getResourceAsStream("/WEB-INF/db.properties");
Properties p=new Properties();
//将读取的配置文件对应的流对象交给Properties
p.load(in);
System.out.println("uname:"+p.getProperty("uname"));
System.out.println("upass:"+p.getProperty("upass"));
System.out.println("class:"+p.getProperty("class"));
}
}
运行结果如下:
二:XML文件的读取
1.根据文件存在的位置来取的方法是跟properties文件一样的
注:properties文件的解析方式有java.util.properties这个类来完成
2.XML文件应该有一个工具类来完成:
jdk/jdom
sax解析 由上往下解析 (移动端用的比较多)
dom4j解析 由外到内解析
dom4j(代替) ——> sax解析 jdom解析(落后)
dom4j+xpath解析xml文件
3. xpath等同数据库的select语句
document.selectNodes(xpath);//查一组
document.selectSingleNode(xpath);//查单个
首先操作:
导入外部jar包
再展示studentsxml文件的内容:
<?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.xwt.parse;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Properties;
import javax.xml.transform.sax.SAXResult;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* 如何解析xml 获取其中想要得到的内容
* xml解析技术:
* dom4j(代替) ——> sax解析 jdom解析(落后)
*
*/
public class Demo4 {
public static void main(String[] args) throws Exception {
//students.xml
InputStream in=Demo4.class.getResourceAsStream("students.xml");
SAXReader reader=new SAXReader();
//将配置文件xml内容加载进内存
Document doc=reader.read(in);
//System.out.println(doc.asXML());
//xpath 八爪鱼 按照查找目录的方式查找xml内容
List<Element> stu=doc.selectNodes("/students/student");
for (Element s : stu) {
//System.out.println(s.asXML());
//获取sid的属性值与s002进行对比 如果是那么就取出name标签对应的值
if("s002".equals(s.attributeValue("sid"))) {
Element name=(Element) s.selectSingleNode("name");
//System.out.println(name.asXML());
//获取标签内部的文本类容
System.out.println("名字:"+name.getText());
}
}
}
}
得到小芳的名字第第二种属性代码如下:
package com.xwt.parse;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Properties;
import javax.xml.transform.sax.SAXResult;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* 如何解析xml 获取其中想要得到的内容
* xml解析技术:
* dom4j(代替) ——> sax解析 jdom解析(落后)
*
*/
public class Demo5 {
public static void main(String[] args) throws Exception {
//students.xml
InputStream in=Demo5.class.getResourceAsStream("students.xml");
SAXReader reader=new SAXReader();
//将配置文件xml内容加载进内存
Document doc=reader.read(in);
Element stu=(Element) doc.selectSingleNode("/students/student[@sid='s002']");
//System.out.println(stu.asXML());
Element name=(Element) stu.selectSingleNode("name");
System.out.println("名字:"+name.getText());
}
}
作业:config.xml解析
1、获取所有action中的type的值
2、获取第二个action中的type的值
3、获取第二个action的所有forward的path
4、获取第二个action的第二个forward的path
代码如下:
package com.xwt.parse;
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;
/**
* 作业:config.xml解析 1、获取所有action中的type的值 2、获取第二个action中的type的值
* 3、获取第二个action的所有forward的path 4、获取第二个action的第二个forward的path
*
* @author 婉婷宝贝
*
*/
public class HomeWork {
public static void main(String[] args) throws Exception {
// config.xml
InputStream in = Demo4.class.getResourceAsStream("config.xml");
SAXReader red = new SAXReader();
Document doc = red.read(in);
// 作业1:获取所有action中的type的值
List<Element> actEle = doc.selectNodes("/config/action");
for (Element act : actEle) {
System.out.println("作业1:获取所有action中的type的值:" + act.attributeValue("type"));
}
// 作业2:获取第二个action中的type的值
List<Element> actEle2 = doc.selectNodes("/config/action[@path='/loginAction']");
for (Element act2 : actEle2) {
System.out.println("作业2:获取第二个action中的type的值:" + act2.attributeValue("type"));
}
// 作业3:获取第二个action的所有forward的path
List<Element> actEle3 = doc.selectNodes("/config/action[@path='/loginAction']/forward");
for (Element act3 : actEle3) {
System.out.println("作业3:获取第二个action的所有forward的path:" + act3.attributeValue("path"));
}
// 作业4:获取第二个action的第二个forward的path
List<Element> actEle4 = doc.selectNodes("/config/action[@path='/loginAction']/forward[@name='b']");
for (Element act4 : actEle4) {
System.out.println("作业4:获取第二个action的第二个forward的path:"+act4.attributeValue("path"));
}
}
}