XML-解析
1. Java中配置文件的三种配置位置及读取方式
- 1 XML和*.properties(属性文件)
- 2 存放位置
- 1 src根目录下
- 2 与读取配置文件的类在同一包
- 3 WEB-INF(或其子目录下)
下面展示一些 内联代码片
package com.lrc.jiexi;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* 各个位置下的资源文件(properties、xml结尾的文件)的读取方式
* 1.同包下的资源文件读取(不常用)
* 2.将所有的资源文件包含在根目录下
* 编译后所有的资源文件都会进web-inf下
* 3.直接将资源文件放到web-inf下
*/
public class PropertiesDemo {
public static void main(String[] args) throws IOException {
//将当前类同包下的db.properties资源文件转换成输入流
InputStream in=PropertiesDemo.class.getResourceAsStream("db.properties");
//如果这个包中没有这个文件,意味着流也不存在,会报空指针异常
Properties p=new Properties();
//读取的配置文件对应的流对象交给Properties管理
p.load(in);//把转换的输入流传进去(资源文件已经以流的形式转换,就加载进去)
//查看一下里面有不有
System.out.println(p.getProperty("uname"));
System.out.println(p.getProperty("upwd"));
}
}
package com.lrc.jiexi;
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 PropertiesServlet extends HttpServlet {
//端口号
private static final long serialVersionUID=1160110259263103368L;
@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"));
}
}
代码效果显示如下
2.XML的作用
- 配置
- properties(不需要重启服务器,通常用于定义常量)
- xml
- 数据交换
- xml
- webservice
- json
- 静态资源文件
- css,js,html,图片,视屏
3.dom4j+xpath解析xml文件
xpath等同数据库的select语句
xpath按照查找目录的方式去查找xml内容
xml可以作为数据传输
- DOM由节点组成
- 元素节点
- 属性节点
- 文本节点
下面展示一些 内联代码片
package com.lrc.jiexi;
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;
/**
* 如何解析xml,获取其中想要的内容
* xml解析技术:
* dom4j(主流),sax,jdom
*/
public class ProDemo {
public static void main(String[] args) throws DocumentException {
InputStream in=ProDemo.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 ele : stu) {
// //System.out.println(ele.asXML());
// //获取sid的属性值,s002对比,如果是,就取出name的值
// if("s002".equals(ele.attributeValue("sid"))) {
// Element nele=(Element) ele.selectSingleNode("name");
// //System.out.println(nele.asXML());
// //获取标签里的文本内容
// System.out.println(nele.getText());
// }
// }
Element sele=(Element)doc.selectSingleNode("/students/student[@sid='s002']");
//System.out.println(sele.asXML());
Element nele=(Element) sele.selectSingleNode("name");
//获取标签里的文本内容
System.out.println(nele.getText());
}
}
代码效果显示如下
自主作业
1、获取所有action中的type的值
2、获取第二个action中的type的值
3、获取第二个action的所有forward的path
4、获取第二个action的第二个forward的path
下面展示一些 内联代码片
。
package com.lrc.jiexi;
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;
/**
* 1、获取所有action中的type的值
* 2、获取第二个action中的type的值
* 3、获取第二个action的所有forward的path
* 4、获取第二个action的第二个forward的path
*
*/
public class Work {
public static void main(String[] args) throws DocumentException {
InputStream in=ProDemo.class.getResourceAsStream("config.xml");
SAXReader reader=new SAXReader();
//将配置文件xml内容加载进内存
Document doc=reader.read(in);
//1、获取所有action中的type的值
// List<Element> cf=doc.selectNodes("/config/action");
// for (Element ele : cf) {
// //System.out.println(ele.asXML());
// String ty=ele.attributeValue("type");
// //System.out.println(nele.asXML());
// //获取标签里的文本内容
// System.out.println(ty);
// }
//2、获取第二个action中的type的值
// List<Node> cf=doc.selectNodes("/config/action[@path='/loginAction']");
// for (Node node : cf) {
// Element el=(Element)node;
// String ty=el.attributeValue("type");
// System.out.println(ty);
// }
//3、获取第二个action的所有forward的path
// List<Node> cf=doc.selectNodes("/config/action[@type='test.LoginAction']/forward");
// for (Node node : cf) {
// Element el=(Element)node;
// String p=el.attributeValue("path");
// System.out.println(p);
// }
//4、获取第二个action的第二个forward的path
List<Node> cf=doc.selectNodes("/config/action[@type='test.LoginAction']/forward[@name='success']");
for (Node node : cf) {
Element el=(Element)node;
String p=el.attributeValue("path");
System.out.println(p);
}
}
}
代码效果显示如下