厚积薄发之XML相关技术

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了厚积薄发之XML相关技术相关的知识,希望对你有一定的参考价值。

XML基础知识

  1. xml是可扩展的标签语言
  2. 特点:标签自定义
  3. 作用:存储数据(配置文件)
  4. 书写规范:
    1.区分大小写
    2.应该有一个跟标签
    3.标签必须关闭
    <xx></xx>
    <xx/>
    4.属性必须用引号引起来
    <xx att="value"/>
    5.标签体中的空格或者制表符等内容都是作为数据内容存在的
    <xxx>aa</xxx>不等于<xxx> aa </xxx>
    6.特殊字符必须转移
    < > &
    满足上面规范的文件我们成为格式良好的xml文件,可以通过浏览器浏览
  5. 后缀名:
    .xml
  6. xml组成部分:

声明:
  告诉别人我是一个xml文件 <?xml version="1.0" encoding="UTF-8" ?>
  必须放在第一行
  必须顶格写
元素 (标签):
  格式:<xx></xx>和<xx/>
  要求:
  1.必须关闭
  2.标签名不能 xml Xml XML 等等开头
  3.标签名中不能出现空格或者":"等等特殊字符
属性:
  格式:<xx 属性名="属性值"/>
  要求:属性值必须引起来
注释:
  和html一样<!---->
CDATA:
  由于xml文件中的特殊字符必须需要转义,但是如果需要转义的地方很多,就比较麻烦,通过CDATA可以保证数据的原样输出
  格式:
  <![CDATA[
  原样输出的内容
  ]]>

XML的解析技术

  • 解析方式:
  1. sax解析 特点:逐行解析 只能查询 不能增删查
  2. dom解析 特点一次性加载到内存中,形成一颗dom树,可以对dom树进行crud操作
  • 解析技术:
  1. JAXP
  2. JDom
  3. jsoup
  4. dom4j:经常使用的解析开发包,hibernate底层也是采用dom4j来进行解析

dom4j的使用步骤

  1. 导入jar包
  2. 创建核心对象 SAXReader
  3. 将xml文档加载到内存中形成一颗dom树
  4. 获取根节点
  5. 通过根节点获取其他节点(文本节点,元素节点,属性节点

dom4j的使用示例

  1.   导入jar   dom4j-1.6.1.jar
  2.   在项目下创建测试的xml文档   我这里创建的是test.xml技术分享技术分享
  3. 创建测试类技术分享

Xpath解析技术

 

  1. 由于dom4j的解析只能从根节点开始来获取到相应的节点(属性节点,元素节点,文本节点);不够灵活,Xpath解析是基于dom4j的基础上进行扩展的,所以也要应用到dom4j的jar包
  2. Xpath的使用步骤
    1.  导入jar包  dom4j-1.6.1.jar 和jaxen-1.1-beta-6.jar
    2. 加载dom树
    3. 使用api
      selectNode("表达式");
      selectSingleNode("表达式");

    4. 表达式的写法:
      / 从根节点选取
      // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
      例如一个标签下有一个id属性且有值 id=2;
      //元素名[@属性名=‘属性值‘]
      //元素名[@id=‘2‘]

  3. Xpath演示技术分享

关于dom4j对xml文档的增删改查的方法

 

  1. 增加
     1     // 添加元素
     2     @Test
     3     public void method4() throws Exception {
     4         // 得到Document
     5         SAXReader reader = new SAXReader();
     6         Document doc = reader.read(new File("J:\\\\ecplisework\\\\testJar\\\\xml\\\\test.xml"));
     7 
     8         // 获取root元素
     9         Element root = doc.getRootElement();
    10         Element stuEle = root.addElement("student"); // 添加了student元素
    11         // 给stuEle添加属性,名为number,值为1003
    12         stuEle.addAttribute("number", "1003");
    13         // 分别为stuEle添加名为name、age、sex的子元素,并为子元素设置文本内容
    14         stuEle.addElement("name").setText("wangWu");
    15         stuEle.addElement("age").setText("18");
    16         stuEle.addElement("sex").setText("male");
    17 
    18         // 设置保存的格式化器 1. \\t,使用什么来完成缩进 2. true, 是否要添加换行
    19         OutputFormat format = new OutputFormat("\\t", true);
    20         format.setTrimText(true); // 去掉空白
    21         // 在创建Writer时,指定格式化器
    22         XMLWriter writer = new XMLWriter(new FileOutputStream("J:\\\\ecplisework\\\\testJar\\\\xml\\\\test.xml"), format);
    23         writer.write(doc);
    24     }
  2.  修改xml操作
     1 // 修改元素
     2     @Test
     3     public void method5() throws Exception {
     4 
     5         // 得到Document
     6         SAXReader reader = new SAXReader();
     7         Document doc = reader.read(new File("J:\\\\ecplisework\\\\testJar\\\\xml\\\\test.xml"));
     8 
     9         // 使用XPath找到符合条件的元素
    10         // 查询student元素,条件是number属性的值为1003
    11         Element stuEle = (Element) doc.selectSingleNode("//student[@number=‘1003‘]");
    12         // 修改stuEle的age子元素内容为81
    13         stuEle.element("age").setText("81");
    14         // 修改stuEle的sex子元素的内容为female
    15         stuEle.element("sex").setText("female");
    16         // 设置保存的格式化器 1. \\t,使用什么来完成缩进 2. true, 是否要添加换行
    17         OutputFormat format = new OutputFormat("\\t", true);
    18         format.setTrimText(true); // 去掉空白
    19         // 在创建Writer时,指定格式化器
    20         XMLWriter writer = new XMLWriter(new FileOutputStream("J:\\\\ecplisework\\\\testJar\\\\xml\\\\test.xml"), format);
    21         writer.write(doc);
    22 
    23     }

     

  3. 删除节点
     1 // 删除元素
     2     @Test
     3     public void method6() throws Exception {
     4 
     5         // 得到Document
     6         SAXReader reader = new SAXReader();
     7         Document doc = reader.read(new File("J:\\\\ecplisework\\\\testJar\\\\xml\\\\test.xml"));
     8 
     9         // 查找student元素,条件是name子元素的文本内容为wangWu
    10         Element stuEle = (Element) doc.selectSingleNode("//student[name=‘wangWu‘]");
    11 
    12         // 2. 获取父元素,使用父元素删除指定子元素
    13         stuEle.getParent().remove(stuEle);
    14 
    15         // 设置保存的格式化器 1. \\t,使用什么来完成缩进 2. true, 是否要添加换行
    16         OutputFormat format = new OutputFormat("\\t", true);
    17         format.setTrimText(true); // 去掉空白
    18         // 在创建Writer时,指定格式化器
    19         XMLWriter writer = new XMLWriter(new FileOutputStream("J:\\\\ecplisework\\\\testJar\\\\xml\\\\test.xml"), format);
    20         writer.write(doc);
    21     }

     

  4. 查询
     1 // 查找
     2     @Test
     3     public void method() throws Exception {
     4         // 创建一个核心对象 SAXReader
     5                 SAXReader reader = new SAXReader();
     6                 // 获取dom树
     7                 Document doc = reader.read("J:\\\\ecplisework\\\\testJar\\\\xml\\\\test.xml");
     8                 // 获取根节点
     9                 Element root = doc.getRootElement();
    10                 // 获取其他子节点
    11                 List<Element> element = root.elements();
    12                 // 遍历子节点
    13                 for (Element ele : element) {
    14                     // 获取bean元素节点的name文本节点
    15                     String elementText = ele.elementText("name");
    16                     System.out.println(elementText);
    17 
    18                 }
    19                 // 也可以获取跟节点的属性
    20                 System.out.println(root.attributeValue("version"));
    21     }

     

DOM4J无论在那个方面都是非常出色的。如今越来越多的Java软件在使用DOM4J来读写XML,例如Hibernate,包括sun公司自己的JAXM也用了DOM4J。









































以上是关于厚积薄发之XML相关技术的主要内容,如果未能解决你的问题,请参考以下文章

厚积薄发Lua全局变量代码规范

厚积薄发Lua与C#之间的穿梭问题

厚积薄发LuaJIT性能热点函数优化

厚积薄发ToLua的释放时机

厚积薄发系列之listener

厚积薄发系列之Java反射