dom4j基本使用_xpath基本使用_junit测试

来源:互联网 发布:承德县大数据招聘信息 编辑:程序博客网 时间:2024/06/06 12:38


1. Java项目(Eclipse)结构




2. 项目下载(0积分)


dom4j_xpath_junitTest.zip


3. 代码


package org.foo.utils;import java.io.FileWriter;import java.io.IOException;import java.net.URL;import java.util.Iterator;import java.util.List;import org.dom4j.Attribute;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.Node;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;import org.junit.Test;final public class XmlUtils {private static URL URL = XmlUtils.class.getClassLoader().getResource("configuration.xml");/** ---------------------------------- *\获取Document对象\*  ---------------------------------- */public static Document getDocument(URL url) throws DocumentException {// url = XmlUtils.class.getResource("configuration.xml");SAXReader reader = new SAXReader();                 return reader.read( url );}public static Document getDocument(String xmlString) throws DocumentException {/*xmlString ="<configuration>                                                    " +"    <users>                                                        " +"        <user id='user_1' loginName='zhangsan' password='123'/>    " +"        <user id='user_2' loginName='lisi' password='456'>         " +"            <role name='admin'/>                                   " +"            <role name='programmer'/>                              " +"        </user>                                                    " +"    </users>                                                       " +"</configuration>                                                   " ;*/return DocumentHelper.parseText(xmlString); }public static Document getDocument() throws DocumentException {// 空文档return DocumentHelper.createDocument();}/** ---------------------------------- *\将文档写入XML文件\*  ---------------------------------- */// 普通写入(全英文,无缩进无换行)public static void write2Xml(Document document) throws IOException {XMLWriter writer = null;try {writer = new XMLWriter( new FileWriter(URL.getPath()) );writer.write(document);} finally {if (writer != null) {writer.close();}}}// 格式化写入(指定编码,缩进+换行)public static void write2XmlWithPrettyFormatAndEncoding(Document document, String encoding) throws IOException {XMLWriter writer = null;try {// formatOutputFormat format = OutputFormat.createPrettyPrint(); // characterSet, eg. UTF-8 GBKformat.setEncoding(encoding);writer = new XMLWriter( new FileWriter(URL.getPath()), format );writer.write(document);} finally {if (writer != null) {writer.close();}}}/** ---------------------------------- *\字符串 <==> XML\*  ---------------------------------- */public static Document xmlString2Document(String xmlString) throws DocumentException {if (xmlString == null) {xmlString ="<configuration>                                                 " +"    <users>                                                     " +"        <user id='user_1' loginName='zhangsan' password='123'/> " +"        <user id='user_2' loginName='lisi' password='456'>      " +"            <role name='admin'/>                                " +"            <role name='programmer'/>                           " +"        </user>                                                 " +"    </users>                                                    " +"</configuration>                                                " ;}return DocumentHelper.parseText(xmlString); }public static String document2XmlString(Document document) {return document.asXML();}/** ---------------------------------- *\节点对象操作\*  ---------------------------------- */// 1. 获取根节点@Test public void testOperationNode_1() throws Exception {Document document = getDocument( URL );Element rootElement = document.getRootElement();System.out.println("<" + rootElement.getName() + ">");}// 2. 获取节点的<第一个>子节点@Test public void testOperationNode_2() throws Exception { Document document = getDocument( URL );Element rootElement = document.getRootElement();Element firstChild = rootElement.element("users");System.out.println("<" + firstChild.getName() + ">");}// 3. 获取标签体内容( Text,CDATA and Entitynodes )@Test public void testOperationNode_3() throws Exception { Document document = getDocument( URL );Element rootElement = document.getRootElement();String text = rootElement.getText();System.out.println("[" + text + "]");}// 4. 获取<所有的>子节点@Test public void testOperationNode_4() throws Exception { Document document = getDocument( URL );Element rootElement = document.getRootElement();Element firstChild = rootElement.element("users");List<Element> children = firstChild.elements();for (Iterator it = children.iterator(); it.hasNext();) {      Element e = (Element) it.next();System.out.println( "<" + e.getName() + ">");}  }// 5. 遍历<子节点>@Test public void testOperationNode_5() throws Exception {Document document = getDocument( URL );Element rootElement = document.getRootElement();Element firstChild = rootElement.element("users");for (Iterator it = firstChild.elementIterator(); it.hasNext();) { Element e = (Element) it.next();System.out.println( "<" + e.getName() + ">");}}// 6. 遍历<指定名称>的<子节点>@Test public void testOperationNode_6() throws Exception { Document document = getDocument( URL );Element rootElement = document.getRootElement();for (Iterator it = rootElement.elementIterator("users"); it.hasNext();) { Element e = (Element) it.next();System.out.println( "<" + e.getName() + ">");}}// 7. 添加<子节点>    注:操作节点后,需要将 document写入xml文件@Test public void testOperationNode_7() throws Exception { Document document = getDocument( URL );Element rootElement = document.getRootElement();rootElement.addElement("addElment");System.out.println( document2XmlString(document) );}// 8. 给节点<添加文本>@Test public void testOperationNode_8() throws Exception { Document document = getDocument( URL );Element rootElement = document.getRootElement();rootElement.addElement("addElment")   .setText("a new child");;System.out.println( document2XmlString(document) );}// 9. 删除<子节点>@Test public void testOperationNode_9() throws Exception { Document document = getDocument( URL );Element rootElement = document.getRootElement();rootElement.remove( rootElement.element("users") );System.out.println( document2XmlString(document) );}// 10. 添加 CDATA节点@Test public void testOperationNode_10() throws Exception { Document document = getDocument( URL );Element rootElement = document.getRootElement();rootElement.addCDATA("<c:if test=\"{wahh}\"></c:if>");System.out.println( document2XmlString(document) );}// 11. 根据<ID属性值>获取节点@Test public void testOperationNode_11() throws Exception { Document document = getDocument( URL );// ID="user_1"Element element = document.elementByID("user_1");System.out.println( element.getName() );}/** ---------------------------------- *\节点对象的属性操作\*  ---------------------------------- */// 1. 获取某节点的<属性节点>@Test public void testOperationAttr_1() throws Exception { Document document = getDocument( URL );Element element = document.elementByID("user_1");Attribute loginNameAttribute = element.attribute("loginName");System.out.println(loginNameAttribute);}// 2. 获取<属性节点>的值@Test public void testOperationAttr_2() throws Exception { Document document = getDocument( URL );Element element = document.elementByID("user_1");Attribute loginNameAttribute = element.attribute("loginName");System.out.println(loginNameAttribute.getValue());System.out.println(loginNameAttribute.getText());}// 3. 删除<属性节点>@Test public void testOperationAttr_3() throws Exception { Document document = getDocument( URL );Element element = document.elementByID("user_1");Attribute loginNameAttribute = element.attribute("loginName");element.remove(loginNameAttribute);System.out.println( document2XmlString(document) );}// 4. 遍历节点的所有属性@Test public void testOperationAttr_4() throws Exception { Document document = getDocument( URL );Element element = document.elementByID("user_1");for (Iterator it = element.attributeIterator(); it.hasNext();){   Attribute attribute = (Attribute) it.next();String attributeName = attribute.getName();String attributeValue = attribute.getValue();System.out.println(attributeName + "=" + attributeValue);}}// 5. <添加/替换>属性节点@Test public void testOperationAttr_5() throws Exception { Document document = getDocument( URL );Element element = document.elementByID("user_1");element.addAttribute("loginName", "zhang123"); // 替换element.addAttribute("newAttr", "wahh"); // 添加System.out.println(document2XmlString(document));}/** ---------------------------------- *\xpath-路径表达式\*  ---------------------------------- *//*/从根节点选取; 从子节点中选//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置; 从后代中选.选取当前节点..选取当前节点的父节点@选取属性*/// 1. "/configuration/users/user"从根节点开始,选取所有的<user>@Test public void testXpath_1() throws Exception { Document document = getDocument( URL );String xpathExpression = "/configuration/users/user";List<Element> nodeList = document.selectNodes(xpathExpression);for (Element element : nodeList) {System.out.println(element.attributeValue("ID"));}}// 2. "//user"选取所有的<user>@Test public void testXpath_2() throws Exception { Document document = getDocument( URL );String xpathExpression = "//user";List<Element> nodeList = document.selectNodes(xpathExpression);for (Element element : nodeList) {System.out.println(element.attributeValue("ID"));}}// 3. "//users/user"选取<users>的所有<user>子节点@Test public void testXpath_3() throws Exception { Document document = getDocument( URL );String xpathExpression = "//users/user";List<Element> nodeList = document.selectNodes(xpathExpression);for (Element element : nodeList) {System.out.println(element.attributeValue("ID"));}}// 4. "/configuration//user"选取<configuration>的所有<user>后代节点@Test public void testXpath_4() throws Exception { Document document = getDocument( URL );String xpathExpression = "/configuration//user";List<Element> nodeList = document.selectNodes(xpathExpression);for (Element element : nodeList) {System.out.println(element.attributeValue("ID"));}}// 5. "//@loginName"选取有属性名为 loginName 的属性节点@Test public void testXpath_5() throws Exception { Document document = getDocument( URL );String xpathExpression = "//@loginName";List<Attribute> attributeList = document.selectNodes(xpathExpression);for (Attribute attribute : attributeList) {System.out.println(attribute.getValue());}}// 6. "//@password='123'"是否存在 loginName='zhangsan' 的节点@Test public void testXpath_6() throws Exception { Document document = getDocument( URL );String xpathExpression = "//@password='123'";List<Boolean> list = document.selectNodes(xpathExpression);for (Boolean isExist : list) {System.out.println(isExist);}}/** ---------------------------------- *\xpath-谓语(Predicates)谓语用来查找某个特定的节点或者包含某个指定的值的节点。谓语被嵌在方括号中。\*  ---------------------------------- */// 1. "//user[1]"选取第一个<user>节点, 节点索引从1开始@Test public void testPredicates_1() throws Exception { Document document = getDocument( URL );String xpathExpression = "//user[1]";List<Element> nodeList = document.selectNodes(xpathExpression);for (Element element : nodeList) {System.out.println(element.attributeValue("ID"));}}// 2. "//user[last()]"选取最后<user>节点@Test public void testPredicates_2() throws Exception { Document document = getDocument( URL );String xpathExpression = "//user[last()]";List<Element> nodeList = document.selectNodes(xpathExpression);for (Element element : nodeList) {System.out.println(element.attributeValue("ID"));}}// 3. "//user[last()-1]"选倒数第二个<user>节点@Test public void testPredicates_3() throws Exception { Document document = getDocument( URL );String xpathExpression = "//user[last()-1]";List<Element> nodeList = document.selectNodes(xpathExpression);for (Element element : nodeList) {System.out.println(element.attributeValue("ID"));}}// 4. "//user[position()<3]"选前两个<user>节点@Test public void testPredicates_4() throws Exception { Document document = getDocument( URL );String xpathExpression = "//user[position()<3]";List<Element> nodeList = document.selectNodes(xpathExpression);for (Element element : nodeList) {System.out.println(element.attributeValue("ID"));}}// 5. "//user[@loginName]"选有loginName属性的<user>节点@Test public void testPredicates_5() throws Exception { Document document = getDocument( URL );String xpathExpression = "//user[@loginName]";List<Element> nodeList = document.selectNodes(xpathExpression);for (Element element : nodeList) {System.out.println(element.attributeValue("ID"));}}// 6. "//user[@loginName='zhangsan']"选 loginName属性=zhangsan 的<user>节点@Test public void testPredicates_6() throws Exception { Document document = getDocument( URL );String xpathExpression = "//user[@loginName='zhangsan']";List<Element> nodeList = document.selectNodes(xpathExpression);for (Element element : nodeList) {System.out.println(element.attributeValue("ID"));}}/** ---------------------------------- *\通配符\*  ---------------------------------- *//* *匹配任何元素节点 @* 匹配任何属性节点 node() 匹配任何类型节点 */// 1. "//products/*"products的所有子节点(元素节点)@Test public void testWildcard_1() throws Exception {Document document = getDocument( URL );String xpathExpression = "//products/*";List<Element> nodeList = document.selectNodes(xpathExpression);for (Element element : nodeList) {System.out.println(element.attributeValue("name"));}}// 2. "//*"所有元素节点@Test public void testWildcard_2() throws Exception {Document document = getDocument( URL );String xpathExpression = "//*";List<Element> nodeList = document.selectNodes(xpathExpression);for (Element element : nodeList) {System.out.println(element.getName());}}// 3. "//product[@*]"带有属性的<product>节点@Test public void testWildcard_3() throws Exception {Document document = getDocument( URL );String xpathExpression = "//product[@*]";List<Element> nodeList = document.selectNodes(xpathExpression);for (Element element : nodeList) {System.out.println(element.getName());}}// 4. "//products/node()"<products>所有节点(元素节点,文本节点)@Test public void testWildcard_4() throws Exception {Document document = getDocument( URL );String xpathExpression = "//products/node()";List<Node> nodeList = document.selectNodes(xpathExpression);for (Node node : nodeList) {short nodeType = node.getNodeType();switch (nodeType) {case Node.ELEMENT_NODE:System.out.println("<" + node.getName() + ">");break;case Node.ATTRIBUTE_NODE:System.out.println(node.getName() + "=" + node.getText());break;case Node.TEXT_NODE:System.out.println("[" + node.getText() + "]");break;}}}/** ---------------------------------- *\|  路径 连接, 求多个路径的并集\*  ---------------------------------- */@Test public void testPathUnion() throws Exception {Document document = getDocument( URL );String xpathExpression = "//product[@name='Java']  |  //user[@ID='user_3']";List<Element> nodeList = document.selectNodes(xpathExpression);for (Element element : nodeList) {String nodeName = element.getName();System.out.print("<" + nodeName);for (Object attr : element.attributes()) {Attribute attribute = (Attribute) attr;String attributeName = attribute.getName();String attributeValue = attribute.getValue();System.out.print(" " + attributeName + "=\"" + attributeValue + "\"");}System.out.println(">");}}}

<?xml version="1.0" encoding="UTF-8"?><configuration>        <users><user ID="user_1" loginName="zhangsan" password="123"/><user ID="user_2" loginName="lisi" password="123"><role name="admin"/><role name="programmer"/></user><user ID="user_3" loginName="zhangsan" password="123"/></users><products><product name="Java" price="99.99"/><product name="JavaScript" price="77.99"/><product name="C" price="66.99"/><product name="C++" price="55.99"/><product name="C#" price="44.99"/><product/></products>    </configuration>



0 0
原创粉丝点击