XML的解析

1. Java中配置文件的三种配置位置及读取方式

1.1 XML和*.properties(属性文件)
1.2 存放位置
1.2.1 src根目录下
Xxx.class.getResourceAsStream("/config.properties");
1.2.2 与读取配置文件的类在同一包
Xxx.class.getResourceAsStream(“config2.properties”);

代码如下:
在这里插入图片描述
运行结果:
在这里插入图片描述
1.2.1 src根目录下
Xxx.class.getResourceAsStream("/config.properties");

在这里插入图片描述
运行结果:
在这里插入图片描述
1.2.3 WEB-INF(或其子目录下)
ServletContext application = this.getServletContext();
InputStream is =
application.getResourceAsStream("/WEB-INF/config3.properties");

在这里插入图片描述
配置web.xml文件
在这里插入图片描述
运行结果:

在这里插入图片描述

2. dom4j+xpath解析xml文件

1 XML文件解析的4种方法
通常解析XML文件有四种经典的方法。基本的解析方式有两种,一种叫SAX,另一种叫DOM。SAX是基于事件流的解析,DOM是基于XML文档树结构的解析。在此基础上,为了减少DOM、SAX的编码量,出现了JDOM,其优点是,20-80原则(帕累托法则),极大减少了代码量。通常情况下JDOM使用时满足要实现的功能简单,如解析、创建等要求。但在底层,JDOM还是使用SAX(最常用)、DOM、Xanan文档。另外一种是DOM4J,是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。具体四种方法的使用,百度一下,会有众多详细的介绍。

2 XPath简单介绍
XPath是一门在XML文档中查找信息的语言。XPath用于在 XML 文档中通过元素和属性进行导航,并对元素和属性进行遍历。XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 同时被构建于 XPath 表达之上。因此,对 XPath 的理解是很多高级 XML 应用的基础。XPath非常类似对数据库操作的SQL语言,或者说JQuery,它可以方便开发者抓起文档中需要的东西。其中DOM4J也支持XPath的使用。

3 DOM4J使用XPath
DOM4J使用XPath解析XML文档是,首先需要在项目中引用两个JAR包:
dom4j-1.6.1.jar:DOM4J软件包,下载地址http://sourceforge.net/projects/dom4j/;
jaxen-xx.xx.jar:通常不添加此包,会引发异常(java.lang.NoClassDefFoundError: org/jaxen/JaxenException),下载地址http://www.jaxen.org/releases.html。
3.1 命名空间(namespace)的干扰
在处理由excel文件或其他格式文件转换的xml文件时,通常会遇到通过XPath解析得不到结果的情况。这种情况通常是由于命名空间的存在导致的。以下述内容的XML文件为例,通过XPath=" // Workbook/ Worksheet / Table / Row[1]/ Cell[1]/Data[1] "进行简单的检索,通常是没有结果出现的。这就是由于命名空间namespace(xmlns=“urn:schemas-microsoft-com?spreadsheet”)导致的。

在这里插入图片描述
3.2 XPath对带有命名空间的xml文件解析
第一种方法(read1()函数):使用XPath语法中自带的local-name() 和 namespace-uri() 指定你要使用的节点名和命名空间。 XPath表达式书写较为麻烦。
第二种方法(read2()函数):设置XPath的命名空间,利用setNamespaceURIs()函数。
第三种方法(read3()函数):设置DocumentFactory()的命名空间 ,使用的函数是setXPathNamespaceURIs()。二和三两种方法的XPath表达式书写相对简单。
第四种方法(read4()函数):方法和第三种一样,但是XPath表达式不同(程序具体体现),主要是为了检验XPath表达式的不同,主要指完整程度,是否会对检索效率产生影响。
(以上四种方法均通过DOM4J结合XPath对XML文件进行解析)
第五种方法(read5()函数):使用DOM结合XPath对XML文件进行解析,主要是为了检验性能差异。
没有什么能够比代码更能说明问题的了!果断上代码!

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
3.xml解析,必须要了解我们的xml文件中有什么:
在这里插入图片描述
获取方法有两种:

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

下面我们来介绍获取方法的第二种(查询单个)

在这里插入图片描述运行结果:
在这里插入图片描述
下面我们来介绍获取方法的第一种(查询一组)

在这里插入图片描述

在这里插入图片描述
作业:config.xml解析

<?xml version="1.0" encoding="UTF-8"?>
 <!--
  config标签:可以包含0~N个action标签
 -->
<config>
 <!--
  action标签:可以饱含0~N个forward标签 path:以/开头的字符串,并且值必须唯一 非空 ,子控制器对应的路径
  type:字符串,非空,子控制器的完整类名
 -->
 <action path="/registerAction" type="test.action.RegisterAction">
  <forward name="success" path="/index.jsp" redirect="true" />
  <forward name="failed" path="/register.jsp" redirect="false" />
 </action>
 <action path="/loginAction" type="test.action.LoginAction">
  <forward name="a" path="/index.jsp" redirect="false" />
  <forward name="b" path="/welcome.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;/**

  

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);
  }
  
}

运行结果:

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值