[学习笔记]XML解析之DOM4J

前端之家收集整理的这篇文章主要介绍了[学习笔记]XML解析之DOM4J前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

DOM4J

XML解析

1. 常用API

  • 解析器:SAXReader
  • 文档对象:Document
  • 元素对象:Element
  • 文档帮助类(用于创建节点):DocumentHelper
  • 文档对象子类:DefaultElement
  • 文档对象子类:BaseElement
  • 格式化输出对象:OutputFormat
  • 保存文件对象:XMLWriter

2. 解析XML获取文档对象

   
   
public static void main ( String [] args ) {
// 创建SAXReader对象
SAXReader reader = new SAXReader ();
// 解析XML获取Document对象
try {
Document doc reader . read ( "/bin/LocalList.xml" );
} catch DocumentException e {
printStackTrace ();
}
}

3. 获取节点文本内容

private static String getElementText ( Document doc ) {
// 获取根节点
Element root = . getRootElement ();
// 获取指定节点集合
List < Element > elements root elements ( "City" );
// 获取指定节点
e elements get ( 7 );
// 获取指定节点的文本内容
text e getText ();
return text ;
}

4. 递归获取所有节点的文本

private staticvoid getAllElementText(Document doc) { // 获取根节点 Element root =.getRootElement();// 递归遍历所有节点 recursion(root);}// 使用深度优先搜索递归遍历所有节点 node@H_404_344@// 如果非元素节点,则直接返回ifnodegetNodeType()!=ElementELEMENT_NODEreturn;}// 如果该节点无子元素节点,则输出元素文本elements().isEmpty())SystemoutprintlngetText());else// 如果该节点有子元素,则递归遍历List<> elements for element : elements@H_404_344@// 递归调用element);}}

5.使用迭代器获取所有City节点的元素内容

getCityElementText@H_404_344@// 获取根元素节点// 使用元素迭代器进行迭代Iterator iterator rootelementIterator iteratorhasNext();) e next@H_404_344@// 如果该节点无子元素节点,则输出元素文本内容e 6.将Document保存到XML中
saveXMLtry// 创建XML文件的字节输出OutputStream out newFileOutputStream("src/LocalList.xml"@H_404_344@// 获取数据格式的对象,createCompactFormat紧凑格式,createPrettyPrint缩进格式OutputFormat format OutputFormatcreatePrettyPrint@H_404_344@// 创建XMLWriter对象XMLWriter writer XMLWriter, format@H_404_344@// 将DOM树写入XML文件 writerwritedoc@H_404_344@// 关闭资源closecatchIOException eprintStackTrace 7.修改元素文本内容
update@H_404_344@// 获取修改节点get(3@H_404_344@// 修改文本内容 elementsetText"天上人间"@H_404_344@// 保存文件 8.添加子元素节点
addChild@H_404_344@// 获取添加的父元素节点 city @H_404_344@// 创建要添加的子元素节点 street DocumentHelpercreateElement"street"@H_404_344@// Element streetE1 = new DefaultElement("street");// Element streetE2 = new BaseElement("street");// 设置节点的文本内容 streetsetText"南天门大街"@H_404_344@// 将子节点添加到父节点中 cityaddstreet 9.添加兄弟元素节点
public addSibling@H_404_344@// 获取目标元素节点 elist "City"@H_404_344@// 创建要添加的元素节点DefaultElement);// <City></City>// 设置新节点的文本"哈哈区"@H_404_344@// 在指定位置加入元素 city elist4 10.删除指定节点
removeElement@H_404_344@// 获取删除节点).0@H_404_344@// 用父节点删除子节点remove 11.为节点添加属性
addAttribute@H_404_344@// 获取添加属性的节点// 为节点添加属性addAttribute"type" "food"}

XPath

概述

XPath的作用就像在一个文件系统中定位文件一样在XML文件中定位元素,XPath是由W3C的XPath 1.0标准所描述。

标准

1.如果路径以斜线 / 开始,那么该路径就表示到一个元素的绝对路径

/AAA/CCC:选择AAA的所有CCC子元素。
2.如果路径以双斜线 // 开头,则表示选择文档中所有满足双斜线//之后规则的元素(无论层级关系)。
//DDD/BBB:选择父元素是DDD的 所有 BBB元素。
3.星号 * 表示选择所有由星号之前的路径所定位的元素。
/*/*/*/BBB:选择所有的有3个祖先元素的BBB元素。
//*:选择所有元素。
4.方块号里的表达式可以进一步的指定元素,其中数字表示元素在选择集里的位置,而last()函数则表示选择集中的最后一个元素。
/AAA/BBB[1]:选择AAA的第一个BBB子元素。
/AAA/BBB[last()]:选择AAA的最后一个BBB子元素。
5. 使用 @ 符号来选择特定的属性或特定属性的元素。
//@id:选择所有的id属性
//BBB[@id]:选择有id属性的BBB元素。
//BBB[not(@*)]:选择没有属性的BBB元素。
6.属性的值可以被用来作为选择的准则,normalize-space函数删除了前部和尾部的空格,并且把连续的空格串替换为一个单一的空格。
//BBB[@id='b1']:选择含有属性id且其值为'b1'的BBB元素。
//BBB[normalize-space(@name)='bbb']:选择含有属性name且其值(在用normalize-space函数去掉前后空格后)为'bbb'的BBB元素。
7.多个路径可以用分隔符 | 合并在一起。
/AAA/EEE | //BBB:选择所有的BBB元素和作为AAA子元素的 所有 EEE元素。
8. 相关函数
  • count():计数所选元素的个数。
  • name():返回元素的名称
  • start-with():在该函数的第一个参数字符串是以第二个参数字符开始的情况返回true。
  • contains():当其第一个字符串参数包含有第二个字符串参数时返回true。
  • string-length:返回字符串的字符数,应用&lt;替代<,用&gt;代替>
//*[count(BBB)=2]:选择含有2个BBB子元素的元素。
//*[name()='BBB']:选择所有名称为BBB的元素,等价于//BBB。
//*[starts-with(name(),'B')]:选择所有名称以"B"起始的元素。
//*[contains(name(),'C')]:选择所有名称包含"C"的元素。
//*[string-length(name()) < 3]:选择名字长度小于3的元素。
DOM4J中XPath的使用

1.使用XPath获取指定节点

getNodeNode node selectSingleNode"/State/City/street"()); 2.使用XPath获取节点集合
getNodesNode nodes selectNodes"/State/City"nodessize 3.使用XPath获取指定属性
getAttribute@H_404_344@// 获取拥有Name属性的节点selectSingleNode"//*[@Name]"@H_404_344@// 获取该节点的Name属性String name valueOf"@Name"name 案例
学生信息存储
Dom4jUtils:DOM4J解析的工具类,包括获取文档对象方法和保存文件方法
classDom4jUtils/** * 获取XML数据的Document对象 * * @return */ getDocument pathpath ==nullreturn// 创建XML解析器 doc SAXReader reader SAXReader@H_404_344@// 解析XML文件 readerreadpathDocumentException// 异常处理"读取XML失败!"@H_404_344@ * 将Document对象保存到XML文件 * @param doc 要保存的Document对象boolean saveXmlnull||false@H_404_344@// 创建保存格式 of @H_404_344@// 创建XML写入对象XMLWriter writer @H_404_344@// 将Document对象写入到XML文件 os (File));XMLWriteros of"文件写入错误!"finally// 资源释放writer "资源关闭错误!"true}

config.xml:配置具体Dao的实现类名,xml数据存储路径。
<?xml version="1.0" encoding"UTF-8"?><dao> <student><class>com.xml.dao.impl.StudentDaoByDom4j</class><db>src/com/xml/db/student.xml</db></student></dao>

student.xml:学生数据存储的xml文件
<students> <student studentid="1255" classid"55"><name>帅哥</name><gender></gender><score>90</score></student></students>

StudentDao:DAO的接口设计
package comxmldao;importbean.StudentinterfaceStudentDao * 添加学生信息 * @param s 要添加的学生对象 addStudent s@H_404_344@ * 删除学生的信息 * @param sid 要删除的学生iddeleteint sid@H_404_344@ * 查询生成 * @param sid 要查询的学生idfloat getscore StudentDaoFactory:DAO的获取工厂类,该类为枚举单例,通过config.xml的配置信息,提供获取具体DAO对象的公有方法
orgdom4jDocumentutilDom4jUtilsenumStudentDaoFactory dao getInstance sdao @H_404_344@// 获取配置信息XML文档的Document对象getDocument"bin/com/xml/config/config.xml"@H_404_344@// 获取StudentDao的实现类名 className "/dao/student/class"@H_404_344@// 创建StudentDao实现类StudentDaoClassforNameclassNamenewInstanceInstantiationException|IllegalAccessExceptionClassNotFoundException"配置信息错误!找不到该类。" sdao StudentDaoByDom4j:DAO的实现类,根据配置信息能够获取具体数据XML的位置,并对之操作。
implStudentDaoByDom4jimplements path StudentDaoByDom4j config @H_404_344@// 获取学生信息存储路径this config"/dao/student/db"@H_404_344@// 获取学生信息XML文档的Document对象doc @Override// 性别预处理String[] mask {"男""女""人妖"};// 在根节点下创建学生元素并设置属性addElement"student"addAttribute"studentid"valueOfsgetId()))"classid"getClassId()));// 为学生元素添加子元素"name"getName"gender"mask[getGender()]);"score"getscore@H_404_344@// 将Document保存到XML文件saveXml@H_404_344@// 获取删除的节点"/students/student[@studentid='"+sid"']"@H_404_344@// 使用父节点删除该节点getParentremove@H_404_344@// 获取查询成绩的学生成 score "']/score"@H_404_344@// 返回成绩FloatparseFloatscore 测试
testjunitTestStudentDaoFactoryStudentDaoTest sdao getInstance();@Test testAdd s 1248"苏苏"55280add testDelete sdao.delete testGetscore1255}

猜你在找的XML相关文章