Xml的简单解析
|xml的用途:
1.做数据传输的载体
2 配置
xml又被称为静态资源文件
比如存放在电脑上面的配置, css、js、html、图片、视频…
静态配置文件举例
一个记事本程序的静态资源文件: notepad.ini
java中常见的静态资源文件有:.properties文件和xml文件
1. Java中配置文件的三种配置位置及读取方式
1.1 XML和*.properties(属性文件)
1.2 存放位置
11与读取配置文件的类在同一包
这边用的是一个叫db.properties的文件,如下图所示,在同一个叫src的包下面
db.properties的内容
**效果如下,读取到了db.properties的uname,upass,url,
1.2 src根目录下
下面把src里面的两个资源文件移到它根目录(新建一个source folder文件夹)下进行读取,尝试读取根目录下的文件
何为source folder,就是代码不将其当做文件夹来处理,程序员用来做文件归类所用
代码如下
Properties p=new Properties();
InputStream in = PropertiesDemo.class.getResourceAsStream("/db.properties");
p.load(in);
System.out.println(p.getProperty("uname"));
System.out.println(p.getProperty("upass"));
System.out.println(p.getProperty("url"));
效果如下,同样可以读取到
1.2.3 WEB-INF(或其子目录下)
资源文件存放在web-inf下时读取
*程序运行时是class文件,不用java文件也可以跑,只需要class文件,程序运行时java虚拟机会把其他文件放入web-inf下面
代码如下
package com.Hc;
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 {
// TODO Auto-generated method stub
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通过Tomcat加载,,返回一个ServletContext
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"));
System.out.println(p.getProperty("url"));
}
}
配置xml
效果如下,成功获取
- bin 放命令的;
config 放Tomcat服务配置的;
work 临时文件;
webapp 发布项目的目录;
web-inf
安全目录 含义:不能被外界访问
log 日志
解析指定路径下的资源文件
dom4j+xpath解析xml文件
需要导入jar包
这里给的是一个叫studens。xml的文件
代码如下
package com.Hc;
import java.io.InputStream;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
/**
* 解析指定路径下的资源文件
* 1.dom4j,目前流行的解析jar包
* 2.jdom jdk
* 3.sax解析
* @author Administrator
*
*/
public class XmlDemo {
public static void main(String[] args) throws Exception {
//把xml文件放入流中
InputStream in = XmlDemo.class.getResourceAsStream("students.xml");
//注意是dom4j包下的
SAXReader saxReader = new SAXReader();
//读取到流的对象,记得抛异常,然后返回一个Document对象,也是dom4j包下的
Document doc = saxReader.read(in);
System.out.println(doc.asXML());
}
}
效果如下
//xpash解析(相当于找目录)G:\Program Files\Apache Software Foundation\Tomcat 7.0_Tomcat07
//xpash能够将xml格式的串当做目录结构来进行查找
public class XmlDemo {
public static void main(String[] args) throws Exception {
//把xml文件放入流中
InputStream in = XmlDemo.class.getResourceAsStream("students.xml");
SAXReader saxReader = new SAXReader();
Document doc = saxReader.read(in);
//拿到所有,返回一个list
List<Element> stuEles = doc.selectNodes("/students/student");
//先进入/students/student,在遍历查找指定目标
for (Element stuEle: stuEles) {
//判断是否是sid为s002的,然后输出
if("s002".equals(stuEle.attributeValue("sid"))) {
System.out.println(stuEle.asXML());
}
效果如下
只拿名字
public class XmlDemo {
public static void main(String[] args) throws Exception {
//把xml文件放入流中
InputStream in = XmlDemo.class.getResourceAsStream("students.xml");
SAXReader saxReader = new SAXReader();
Document doc = saxReader.read(in);
//拿到所有,返回一个list
List<Element> stuEles = doc.selectNodes("/students/student");
//先进入/students/student,在遍历查找指定目标
for (Element stuEle: stuEles) {
//判断是否是sid为s002的,然后输出
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());
}
效果如下
/***/通过ID选择器找***
public class XmlDemo {
public static void main(String[] args) throws Exception {
//把xml文件放入流中
InputStream in = XmlDemo.class.getResourceAsStream("students.xml");
//注意是dom4j包下的
SAXReader saxReader = new SAXReader();
Document doc = saxReader.read(in);
List<Element> stuEles = doc.selectNodes("/students/student");
//通过ID选择器找
Element stuEle = (Element) doc.selectSingleNode("/students/student[@sid='s002']");
System.out.println(stuEle.asXML());
}
效果如下
作业:config.xml解析
1、获取所有action中的type的值
2、获取第二个action中的type的值
3、获取第二个action的所有forward的path
4、获取第二个action的第二个forward的path
package com.Hc;
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;
import com.sun.org.apache.bcel.internal.classfile.Attribute;
public class configDemo {
public static void main(String[] args) throws DocumentException {
InputStream in = configDemo.class.getResourceAsStream("config.xml");
SAXReader reader = new SAXReader();
Document doc = reader.read(in);
// 1、获取所有action中的type的值
List<Element> stuElems = doc.selectNodes("/config/action");
for (Element stuEle : stuElems) {
String type = stuEle.attributeValue("type");
System.out.println(type);
}
// 2、获取第二个action中的type的值
List<Node> li = doc.selectNodes("/config/action[@path='/loginAction']");
for (Node node : li) {
Element elem = (Element) node;
String type = elem.attributeValue("type");
System.out.println(type);
}
// 3、获取第二个action的所有forward的path
List<Node> li1 = doc.selectNodes("/config/action[@type='test.LoginAction']/forward");
for (Node node : li1) {
Element elem = (Element) node;
String path = elem.attributeValue("path");
System.out.println(path);
}
// 4、获取第二个action的第二个forward的path
List<Node> li2 = doc.selectNodes("/config/action[@type='test.LoginAction']/forward[@name='success']");
for (Node node : li2) {
Element elem = (Element) node;
String path = elem.attributeValue("path");
System.out.println(path);
}
}
}
效果如下