欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

XML解析

程序员文章站 2022-06-16 15:45:32
...

一,什么是XML
(1)XML,Extensible Markup Language,扩展性标识语言。文件的后缀名为:.xml。就像HTML的作用是显示数据,XML的作用是传输和存储数据。
二,properties文件读取
(1)properties文件的解析我们用一个类完成解析,根据存放位置,
下面我来介绍三个存放位置

      1.2.1 src根目录下
          Xxx.class.getResourceAsStream("/config.properties");
     1.2.2 与读取配置文件的类在同一包
          Xxx.class.getResourceAsStream("config2.properties");
    1.2.3 WEB-INF(或其子目录下)
          ServletContext application = this.getServletContext();
        InputStream is =
          application.getResourceAsStream("/WEB-INF/config3.properties");

(2)当我的文件在我的根目录下
我们可以这样获取里面的内容 代码如下:
思路:
我们要读取根目录下的资源文件,将当前同包下的db.properties资源文件转换输入流
我们写完读取根目录下的代码之后,我们还有写专门的工具类来讲流中的数据解析出来。
还有一点就是斜杆代表根目录。

package com.tanhaifang; import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;/**
 * 读取指定位置下的资源文件(db.properties)
 * 1,读取同包下的资源文件
 * 2.资源文件存放在根目录下
 * 3.资源文件放在web-inf下
 * 
 * 何为 source folder 
 * 就是代码不将其当作文件来处理,程序员用来做文件归类所用
 * 
 * 程序运行时class文件
 * @author Admin
 *
 */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"));
}
}

我们获取到的是db.properties的两个值
结果如下:

XML解析
(3)我们在来试一下与读取配置文件的类在同一包
我们可以这样获取里面的内容 代码如下:
思路:我们要读取同包的资源文件,将当前同包下的db.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"));
}

结果如下:
它也是获取db.properties的两个值

XML解析

(4)source folder是什么?
就是代码不将其当做文件来处理,程序员用来做文件归类所用.

(5)我们在试一下如果我们把文件放在WEB-INF下面怎么获取里面的内容 代码如下:
思路:我们要用上下文来获取
WEB-INF 它是一个安全的目录,也就是一个不能被外界访问的一个目录,只能通过内部配置web.xml通过servlet来访问。
还有就是资源文件存放在web-inf下 “ 程序运行是class文件”
接下我们下面是写一个servlet,通过application来获取值,
还有配置web.xml,同web来把文件的值打印到控制台。

package com.tanhaifang; 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 ParseSrevlet extends HttpServlet { /**
  * 
  */
 private static final long serialVersionUID = 1L; @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 {
 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"));
 }
}

然后写一个web配置

<?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>t226_XML</display-name>

 <servlet>
 <servlet-name>parseSrevlet</servlet-name>
 <servlet-class>com.tanhaifang.ParseSrevlet</servlet-class>
 </servlet>

  <servlet-mapping>
  <servlet-name>parseSrevlet</servlet-name>
  <url-pattern>/parseSrevlet</url-pattern>
  </servlet-mapping>

</web-app>

结果如下:

XML解析
三,XML的解析
(1)文件存在的位置来取,是跟Properties是一样的,接下来我们了解一下XML文件里面有一些什么:
下面的代码大概就是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>

(2)我们解析的XML的文件有很多方法,比如:
1, dom4j解析 (由外到内解析,目前最火的解析方式)
dom4j是一个易用的,开源的库,用于XML,XPath和XSLT。它应用于java平台,采用了java集合框架并完全 支持DOM,SAX和JAXP.
2, jdom/ jbk
3, sax解析(由上往下解析,移动端用的比较多)
(3)我们要通过dom4j和xpath解析xml文件,
思路:
第一我们要导入两个jar包dem4和jaxen,
第二我们要来获取sid=s002和name值:
第三我们获取sid=S002和name值有两种方法
代码如下:

import java.util.List;import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;/*
 * dom4j  
 * jdom jbk
 * sax解析
 * 解析指定路径下的资源文件
 */
public class XMlDemo {
public static void main(String[] args) throws Exception{
 InputStream in= XMlDemo.class.getResourceAsStream("students.xml");
    SAXReader sa=new SAXReader();
    Document doc = sa.read(in);
   // System.out.println(doc.asXML());//输出整个xml的文件值
    //xpayh解析能够将xml格式的窜当初目录结构进行查找
    //获取到所有的文件的值
    //    List<Element> stuEles = doc.selectNodes("/students/student");//查stu这一组节点
    //遍历    这是第一种方法,通过遍历判断
//    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());
//  }
//  
// }
    //第二种方法  
    Element stuS002Ele = (Element) doc.selectSingleNode("/students/student[@sid='s002']");
    System.out.println(stuS002Ele.asXML());

} 
}

结果如下:
两种方法的结果都是一样的。
XML解析

(4)对XML的解析主要的是对每一个元素节点的分析,
下面给大家看两个获取的代码。
代码如下:

  document.selectNodes(xpath);//查一组
  document.selectSingleNode(xpath);//查单个

四,config.xml解析
1、获取所有action中的type的值
2、获取第二个action中的type的值
3、获取第二个action的所有forward的path
4、获取第二个action的第二个forward的path
首先我们来看一下config.xml案例:

<?xml version="1.0" encoding="UTF-8"?>   <config>    <action path="/regAction" type="test.RegAction">      <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>

代码如下:

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;/**
 *   作业:config.xml解析
   1、获取所有action中的type的值
   2、获取第二个action中的type的值
   3、获取第二个action的所有forward的path
   4、获取第二个action的第二个forward的path * @author Admin
 *
 */
public class ConfingDemo {
 public static void main(String[] args) throws Exception {
  InputStream in= ConfingDemo.class.getResourceAsStream("config.xml");
  SAXReader sReader=new SAXReader();
  Document dct = sReader.read(in);
  
  System.out.println("----这是第一题----");
  //1、获取所有action中的type的值
  List<Element> stuElem=dct.selectNodes("/config/action");
  for (Element stuEle : stuElem) {
   String type = stuEle.attributeValue("type");
   System.out.println(type);
   
  }
  System.out.println("----这是第二题----");
    // 2、获取第二个action中的type的值
  List<Node>   list= dct.selectNodes("/config/action[@path='/loginAction']");
  for (Node node : list) {
   Element elem=(Element)node;
   String type=elem.attributeValue("type");
   System.out.println(type);
  }
  
  System.out.println("----这是第三题----");
  //3、获取第二个action的所有forward的path
  List<Node> lis=dct.selectNodes("/config/action[@type='test.LoginAction']/forward");
  for (Node node : lis) {
   Element ele=(Element)node;
   String path=ele.attributeValue("path");
   System.out.println(path);
  }
  
  System.out.println("---这是第四题----");
  // 4、获取第二个action的第二个forward的path
  List<Node> lit=dct.selectNodes("config/action[@type='test.LoginAction']/forward[@name='success']");
  for (Node node : lit) {
   Element eml=(Element)node;
   String path=eml.attributeValue("path");
   System.out .println(path);
  }
  
 }}

结果如下:
XML解析

相关标签: XML解析