解析XML
1.什么是XML?
- XML指可拓展标记语言
- XML是一种标记语言,很类似HTML
- XML的设计宗旨是传输数据,而非显示数据(显示数据应使用HTML及CSS)
- XML标签没有被预定义 (意味着你可以创建出任何命名的标签,例如<QQ></QQ>,而HTML中并无此标签,但是建议尽可能少的使用中文)
2XML有如下作用:
- 存储数据
- 传递数据,即服务器以XML的形式传输数据
- 软件配置
3JAVA中配置文件的三种配置位置以及读取方式
3.1同包下
上面是资源文件,现在来读取XML中的数据
package com.xml;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* 配置文件存放的位置
* 1.同包
* properties文件也是资源文件的一种
* @author T440s
*
*/
public class Dome1 {
public static void main(String[] args) throws IOException {
//获取同包下资源文件,将其转换为流
InputStream ips = Dome1.class.getResourceAsStream("db.properties");
//使用Properties 帮助类 解析流
Properties p=new Properties();
p.load(ips);//加载流
String uname = p.getProperty("uname");
String upass = p.getProperty("upass");
System.out.println(uname+"--------"+upass);
}
}
3.2根目录下(新建Source Folder文件)
读取代码
package com.xml;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* 配置文件存放的位置
* 2.根目录下
* 读取properties文件
* @author T440s
*
*/
public class Dome2 {
public static void main(String[] args) throws IOException {
InputStream ips = Dome1.class.getResourceAsStream("/db.properties");
Properties p=new Properties();
p.load(ips);//加载流
String uname = p.getProperty("uname");
String upass = p.getProperty("upass");
System.out.println(uname+"--------"+upass);
}
}
3.3WIN-INF 安全路径下
package com.servlet;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.servlet.ServletContext;
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("/dome3")
public class pateservlet 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 {
//首先拿到上下文Context
ServletContext Context = req.getServletContext();
InputStream in = Context.getResourceAsStream("/WEB-INF/db.properties");
Properties p=new Properties();
p.load(in);
String uname = p.getProperty("uname");
String upass = p.getProperty("upass");
System.out.println(uname+"--------"+upass);
}
}
打印结果皆为:
mybatis_ssm--------xiaoli
4.dom4j解析
在使用dom4j 解析前,我们还需要下载并导入第三方jar包:dom4j-1.6.1.jar,该包是一种开源的XML解析包。
下载路径:http://www.dom4j.org/dom4j-1.6.1/
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>
解析代码:
package com.xml;
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;
public class Dome4 {
public static void main(String[] args) throws DocumentException {
/**
* 现在获取小王这个人名
* 步骤:
* 1.读取students.xml的xml内容
* 2.解析获取到的所有的student标签内容
* 3.获取到所有student标签的sid
* 4.当sid=s003的时候,获取name标签内容
*
*/
//获取xml文件
InputStream in = Dome4.class.getResourceAsStream("students.xml");
//xml解析器
SAXReader sr=new SAXReader();
//解析XML文件
Document red = sr.read(in);
System.out.println("xml文件内容:"+red.asXML());
//selectNodes获取对应节点对象 返回list
List<Element> student = red.selectNodes("/students/student");
for (Element element : student) {
//获取指定对象的属性值
String sid = element.attributeValue("sid");
if("s003".equals(sid)) {
//selectSingleNode获取对应节点对象单个元素对象
Element name = (Element)element.selectSingleNode("name");
String text = name.getText();
System.out.println("名字:"+text);
}
}
}
}
5.xpath解析
首先导入jaxen-1.1-beta-6.jar jar包, xpath解析是基于dom4j 的;所以还需要导入dom4j jar包
语法:/ 定位路径 @属性
package com.xml;
import java.io.InputStream;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
public class dome6 {
public static void main(String[] args) throws DocumentException {
InputStream in = dome6.class.getResourceAsStream("students.xml");
//解析器
SAXReader sr=new SAXReader();
Document red = sr.read(in);
Element name = (Element) red.selectSingleNode("/students/student[@sid='s002']/name");
System.out.println("名字:"+name.getText());
}
}
最后结果:
名字:小芳
案列:
<?xml version="1.0" encoding="UTF-8"?>
<!--
config标签:可以包含0~N个action标签
-->
<config>
<!--
action标签:可以饱含0~N个forward标签
path:以/开头的字符串,并且值必须唯一 非空
type:字符串,非空
-->
<action path="/regAction" type="test.RegAction">
<!--
forward标签:没有子标签;
name:字符串,同一action标签下的forward标签name值不能相同 ;
path:以/开头的字符串
redirect:只能是false|true,允许空,默认值为false
-->
<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>
读取代码:
package com.xml;
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;
public class Dome3 {
public static void main(String[] args) throws DocumentException {
InputStream in = Dome3.class.getResourceAsStream("config.xml");
SAXReader sr=new SAXReader();
Document red = sr.read(in);//读取流中的数据
//1.获取所有action中的type的值
List<Element> seleNode = red.selectNodes("/config/action");
for (Element element : seleNode) {
String type = element.attributeValue("type");
System.out.println("所有action中的type的值:"+type);
}
//获取第二个action中的type的值
List<Element> Nodes = red.selectNodes("/config/action[@path='/loginAction']");
for (Element element : Nodes) {
String type = element.attributeValue("type");
System.out.println("第二个action中的type的值:"+type);
}
//获取第二个action的所有forward的path
List<Element> Nodess = red.selectNodes("/config/action[@path='/loginAction']/forward");
for (Element element : Nodess) {
String path = element.attributeValue("path");
System.out.println("第二个action的所有forward的path"+path);
}
//获取第二个action的第二个forward的path
List<Element> selectNodes = red.selectNodes("/config/action[@path='/loginAction']/forward[@name='success']");
for (Element element : selectNodes) {
String path = element.attributeValue("path");
System.out.println("第二个action的第二个forward的path:"+path);
}
}
}