XML的用途
http://www.w3school.com.cn/xml/xml_usedfor.asp
①:能够作为一个数据传输的载体
②:可以做配置
静态资源文件
- XML又被称作静态资源的文件
- 静态资源文件就是那种可以设置文本记录一些配置的东西
- 静态资源文件最常见的有两种,一种是properties文件还有就是xml文件形式
如何获取指定位置下的资源文件?有①②③种方法:
方法①:读取同包下的资源文件
- 方法:流对象=当前类.class.getResourceAsStream(“输入你要读取的文件”)
- 用专门的工具类 properties 将流对象的数据解析出来
- 再把数据放到工具类对象中去
下图是配置文件的信息
读取代码如下:
package com.lijiaxue.parse;
import java.io.IOException;
import java.io.InputStream;
import java.util.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"));
}
}
控制台显示如下:
方法②:资源文件存放在根目录下
- 在src下面建一个原文件夹把资源文件放进去
- 方法:流对象=当前类.class.getResourceAsStream("/根路径")
- 用专门的工具类 properties 将流对象的数据解析出来
- 再把数据放到工具类对象中去
下图是配置文件的信息
读取代码如下:
package com.lijiaxue.parse;
import java.io.IOException;
import java.io.InputStream;
import java.util.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"));
}
}
控制台显示如下:
source folder是什么?
- 就是代码不将其当做文件来处理,程序员用来做文件归类所用
方法③:资源文件存放在web-inf下 “ 程序运行是class文件”
- 把资源文件存放到web-inf下面
- 创建一个servlet类 继承于httpServlet
代码如下:
package com.lijiaxue.parse;
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 {
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"));
}
}
servlet配置:
<?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>1_xml</display-name>
<servlet>
<servlet-name>ParseServlet</servlet-name>
<servlet-class>com.lijiaxue.parse.ParseServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>parseServlet</servlet-name>
<url-pattern>parseServlet</url-pattern>
</servlet-mapping>
</web-app>
解析指定路径下的资源文件
解析的包:
- dom4j (最流行)
- jdom jdk (麻烦)
- sax解析 (麻烦)
这个方式跟以上两种差不多 但是不同点①工具是SAXReader ②开始是.load 在这里是.read ③返回一个dom4j下的Document对象
资源文件的内容如下
<?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.lijiaxue.parse;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class XmlDemo {
public static void main(String[] args) throws Exception {
InputStream in = XmlDemo.class.getResourceAsStream("students.xml");
SAXReader saxReader= new SAXReader();
Document doc = saxReader.read(in);
System.out.println(doc.asXML());
}
}
控制台显示如下:
(只获取小芳的信息)方法一(慢)如下:
package com.lijiaxue.parse;
import java.io.InputStream;
import java.util.Iterator;
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 XmlDemo {
public static void main(String[] args) throws Exception {
InputStream in = XmlDemo.class.getResourceAsStream("students.xml");
SAXReader saxReader= new SAXReader();
Document doc = saxReader.read(in);
List<Element> stuEles = doc.selectNodes("/students/student");
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());
}
}
}
}
**控制台显示如下**
(只获取小芳的信息)方法二(快)如下:
- 需要xpath解析:可以将xml格式的串当作目录结构来进行查找
package com.lijiaxue.parse;
import java.io.InputStream;
import java.util.Iterator;
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 XmlDemo {
public static void main(String[] args) throws Exception {
InputStream in = XmlDemo.class.getResourceAsStream("students.xml");
SAXReader saxReader= new SAXReader();
Document doc = saxReader.read(in);
Element stuS002Ele = (Element) doc.selectSingleNode("/students/student[@sid='s002']");
System.out.println(stuS002Ele.asXML());
}
}
控制台显示如下:
以上内容的总结:
如何读取指定位置下的资源文件?
- src根路径下
类名.class.getResourceAsSteam("/文件名"); - 同包下
类名.class.getResourceAsSteam(“文件名”); - WEB-INF下面
ServletContext context = req.getServletContext();
context.getResourceAsSteam("/WEB-INF/文件名");
读取到资源文件后,如何进行解析?
List list = selectNodes(“节点路径”) E:\2019_y2_讲课\T226\3、XML(3)\3、xml建模
Node node = selectSingleNode查询单个
/students/student[@id=‘s002’]