用dom4j读写xml
程序员文章站
2022-05-29 11:40:48
...
一、例子
- public class XMLUtils {
- /**
- * 生成xml文件
- * @param doc
- * @param fileName
- * @param encoding
- */
- public static void createXMLFile(Document doc,String fileName,String encoding){
- XMLWriter writer = null;
- try{
- if(StringUtils.isNotEmpty(encoding)){
- OutputFormat format = OutputFormat.createPrettyPrint();
- format.setEncoding(encoding); // 指定XML编码
- writer = new XMLWriter(new FileWriter(fileName),format);
- }else{
- writer = new XMLWriter(new FileWriter(fileName));
- }
- writer.write(doc);
- }catch(IOException e){
- e.printStackTrace();
- }finally{
- try{
- writer.close();
- }catch(IOException e){
- e.printStackTrace();
- }
- }
- }
- /**
- * 创建Document并返回根结点
- * @param root_label 根标签
- * @return
- */
- public static Document createDocument(String root_label){
- Document doc = DocumentHelper.createDocument();
- doc.setRootElement(doc.addElement(root_label));
- return doc;
- }
- /**
- * 将字符串转化为XML
- * @param xml_string
- * @return
- */
- public static Document createDocumentFromXmlString(String xml_string){
- if(StringUtils.isEmpty(xml_string)){
- xml_string = "<students> <class>test</class> </students>";
- }
- Document document = null;
- try {
- document = DocumentHelper.parseText(xml_string);
- } catch (DocumentException e) {
- e.printStackTrace();
- }
- return document;
- }
- /**
- * 给结点加子结点
- * @param root 相对根
- * @param newNode 新结点
- * @param nodeId 结点Id
- * @param elements 结点元素
- */
- public static void addNodeElement(Element root,String newNode,String nodeId,Map elements){
- Element _newNode = root.addElement(newNode);
- _newNode.addAttribute("id", nodeId).addAttribute("no", nodeId);//设置属性
- Iterator it = elements.entrySet().iterator();
- while(it.hasNext()){//结点下的元素与值
- Map.Entry entry = (Map.Entry)it.next();
- Object key = entry.getKey();
- Object value = entry.getValue();
- _newNode.addElement((String)key).setText((String)value);
- }
- }
- /**
- * 将文档或节点的XML转化为字符串
- * @param filePath
- * @return
- */
- public static String readXMLAsString(String filePath){
- SAXReader reader = new SAXReader();
- Document document=null;
- try {
- document = reader.read(new File(filePath));
- //Element root=document.getRootElement();
- } catch (DocumentException e) {
- e.printStackTrace();
- }
- return document.asXML();
- }
- /**
- * 打印节点的所有子节点
- * @param element
- */
- public static void printAllChildNode(Element element){
- //循环当前节点属性
- Iterator attrs = element.attributeIterator();
- while(attrs.hasNext()){
- Attribute attr = (Attribute)attrs.next();
- System.out.println(attr.getName() + "=" + attr.getText());
- }
- //循环其孩子元素节点
- Iterator elements = element.elementIterator();
- while(elements.hasNext()){
- Element ele = (Element)elements.next();
- if(ele.attribute("id") == null){
- System.out.println(ele.getName() + "=" + ele.getText());
- }
- //递归调用
- printAllChildNode(ele);
- }
- }
- /***
- * 以xpath读取数据
- * @param filePath
- * @param xpath
- */
- public static void printElementsByXPath(String filePath,String xpath){
- SAXReader reader = new SAXReader();
- try{
- Document doc = reader.read(new File(filePath));
- List properties=doc.selectNodes(xpath);
- Iterator it=properties.iterator();
- while(it.hasNext()){
- Element elm=(Element)it.next();
- System.out.println(elm.getText());
- }
- }
- catch(Exception ex){
- ex.printStackTrace();
- }
- }
- public static void main(String[] args){
- Map<String,String> elements = new HashMap<String,String>();
- elements.put("name", "张三");
- elements.put("sex", "男");
- elements.put("age", "20");
- Document doc = XMLUtils.createDocumentFromXmlString("<students></students>");
- doc.getRootElement().addAttribute("year", "2000");
- XMLUtils.addNodeElement(doc.getRootElement(), "student", "20090313001", elements);
- elements.clear();
- elements.put("name", "李四");
- elements.put("sex", "男");
- elements.put("age", "21");
- XMLUtils.addNodeElement(doc.getRootElement(), "student", "20090313002", elements);
- String filePath = "D:/test.xml";
- XMLUtils.createXMLFile(doc, filePath, "GBK");
- //System.out.println(XMLUtils.readXMLAsString(filePath));
- XMLUtils.printElementsByXPath(filePath, "/students/student[@id=\"20090313001\"]/name");
- XMLUtils.printAllChildNode(doc.getRootElement());
- }
- }
public class XMLUtils {
/**
* 生成xml文件
* @param doc
* @param fileName
* @param encoding
*/
public static void createXMLFile(Document doc,String fileName,String encoding){
XMLWriter writer = null;
try{
if(StringUtils.isNotEmpty(encoding)){
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding(encoding); // 指定XML编码
writer = new XMLWriter(new FileWriter(fileName),format);
}else{
writer = new XMLWriter(new FileWriter(fileName));
}
writer.write(doc);
}catch(IOException e){
e.printStackTrace();
}finally{
try{
writer.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
/**
* 创建Document并返回根结点
* @param root_label 根标签
* @return
*/
public static Document createDocument(String root_label){
Document doc = DocumentHelper.createDocument();
doc.setRootElement(doc.addElement(root_label));
return doc;
}
/**
* 将字符串转化为XML
* @param xml_string
* @return
*/
public static Document createDocumentFromXmlString(String xml_string){
if(StringUtils.isEmpty(xml_string)){
xml_string = "<students> <class>test</class> </students>";
}
Document document = null;
try {
document = DocumentHelper.parseText(xml_string);
} catch (DocumentException e) {
e.printStackTrace();
}
return document;
}
/**
* 给结点加子结点
* @param root 相对根
* @param newNode 新结点
* @param nodeId 结点Id
* @param elements 结点元素
*/
public static void addNodeElement(Element root,String newNode,String nodeId,Map elements){
Element _newNode = root.addElement(newNode);
_newNode.addAttribute("id", nodeId).addAttribute("no", nodeId);//设置属性
Iterator it = elements.entrySet().iterator();
while(it.hasNext()){//结点下的元素与值
Map.Entry entry = (Map.Entry)it.next();
Object key = entry.getKey();
Object value = entry.getValue();
_newNode.addElement((String)key).setText((String)value);
}
}
/**
* 将文档或节点的XML转化为字符串
* @param filePath
* @return
*/
public static String readXMLAsString(String filePath){
SAXReader reader = new SAXReader();
Document document=null;
try {
document = reader.read(new File(filePath));
//Element root=document.getRootElement();
} catch (DocumentException e) {
e.printStackTrace();
}
return document.asXML();
}
/**
* 打印节点的所有子节点
* @param element
*/
public static void printAllChildNode(Element element){
//循环当前节点属性
Iterator attrs = element.attributeIterator();
while(attrs.hasNext()){
Attribute attr = (Attribute)attrs.next();
System.out.println(attr.getName() + "=" + attr.getText());
}
//循环其孩子元素节点
Iterator elements = element.elementIterator();
while(elements.hasNext()){
Element ele = (Element)elements.next();
if(ele.attribute("id") == null){
System.out.println(ele.getName() + "=" + ele.getText());
}
//递归调用
printAllChildNode(ele);
}
}
/***
* 以xpath读取数据
* @param filePath
* @param xpath
*/
public static void printElementsByXPath(String filePath,String xpath){
SAXReader reader = new SAXReader();
try{
Document doc = reader.read(new File(filePath));
List properties=doc.selectNodes(xpath);
Iterator it=properties.iterator();
while(it.hasNext()){
Element elm=(Element)it.next();
System.out.println(elm.getText());
}
}
catch(Exception ex){
ex.printStackTrace();
}
}
public static void main(String[] args){
Map<String,String> elements = new HashMap<String,String>();
elements.put("name", "张三");
elements.put("sex", "男");
elements.put("age", "20");
Document doc = XMLUtils.createDocumentFromXmlString("<students></students>");
doc.getRootElement().addAttribute("year", "2000");
XMLUtils.addNodeElement(doc.getRootElement(), "student", "20090313001", elements);
elements.clear();
elements.put("name", "李四");
elements.put("sex", "男");
elements.put("age", "21");
XMLUtils.addNodeElement(doc.getRootElement(), "student", "20090313002", elements);
String filePath = "D:/test.xml";
XMLUtils.createXMLFile(doc, filePath, "GBK");
//System.out.println(XMLUtils.readXMLAsString(filePath));
XMLUtils.printElementsByXPath(filePath, "/students/student[@id=\"20090313001\"]/name");
XMLUtils.printAllChildNode(doc.getRootElement());
}
}
二、使用XPATH
- <AAA>
- <BBB/>
- <CCC/>
- <BBB/>
- <BBB/>
- <DDD>
- <BBB/>
- </DDD>
- <CCC/>
- </AAA>
<AAA> <BBB/> <CCC/> <BBB/> <BBB/> <DDD> <BBB/> </DDD> <CCC/> </AAA>
(1)如果它是以斜线“/”开始,它是描述请求元素的绝对路径。
范例结构:
- 访问元素“AAA”---- “/AAA” 。
- 访问元素“CCC” --- “/AAA/CCC”,访问根目录AAA下面的子节点CCC,本例会得到两个节点的集合。
- 访问根节点AAA的子节点DDD的子节点BBB:“/AAA/DDD/BBB”。
(2)如果路径表达式以“//”开始,它会查找所有符合规则的元素
范例结构:
- “//BBB”,选择所有的元素<BBB/>,本例*有四处
- “//DDD/BBB”,选择元素节点“DDD”下的子节点“BBB”,只要满足元素“BBB”为“DDD”的子元素,就会被选择,本例一处。
(3)“*”选择所有由前面路径定位的元素
范例:
- “/AAA/*”表示选择根节点下所有的元素
- “/*/CCC”选择有一个父元素的“CCC”元素,“/*/*/BBB”选择第三级的根节点下的所有的“BBB”元素
- “//*”表示匹配所有的元素
(4)在方括号中的表达式可以进一步的指定元素,方括号中的数字表示被选择元素集合的位置,last()函数表示被选择元素集的最后一个元素
- “/AAA/BBB[2]” 表示根节点下“BBB”元素集合的第二个元素
- “/AAA/BBB[last()]” 表示根节点下“BBB”元素集合的最后一个元素
(5)“@”表示属性
- <AAA>
- <BBB id = "b1"/>
- <BBB id = "b2"/>
- <BBB name = "bbb"/>
- <BBB/>
- </AAA>
<AAA> <BBB id = "b1"/> <BBB id = "b2"/> <BBB name = "bbb"/> <BBB/> </AAA>
- “//@id”表示所有的名为“id”属性
- “//BBB[@id]”表示所有含有ID属性的BBB元素
- “//BBB[@*]”表示含有属性的所有的BBB元素,本例中的<BBB/>不会被选择,其它三个被选中
- “//BBB[not(@*)]”表示没有属性的元素,本例中<BBB/>被选中,其它的三个元素不被选择
(6)属性的值可以做为选择标准,函数“normalize-space”可以移掉头部和尾部的空格,或者用单个的空格替换
- <AAA>
- <BBB id = "b1"/>
- <BBB name = " bbb "/>
- <BBB name = "bbb"/>
- </AAA>
<AAA> <BBB id = "b1"/> <BBB name = " bbb "/> <BBB name = "bbb"/> </AAA>
- “//BBB[@id=’b1’]”:选择属性值为“b1”的元素“BBB”
- “//BBB[@name=’bbb’]”:选择属性值为“bbb”的元素,注意由于每一个属性名为name的元素“BBB”,其值有空格,不会被选择。
- “//BBB[normalize-space(@name)='bbb']”:选择名称为“name”的,其值为“bbb”,值前后可以有空格,本例则会选择两个“BBB”元素
(7)函数count(*):计算选择元素的个数
- “//*[count(BBB)=2]”,选中含两个“BBB”子元素的元素
- “//*[count(*)=2]”,选中含有两个子元素的元素
下一篇: Django使用MySQL数据集
推荐阅读
-
用MySQL和PHP创建XML
-
Java Web基础入门第五讲 XML语言——DOM4J实现对XML文档的CRUD操作
-
这个坑,我裂开了!!!mybatis的mapper.xml文件中sql语句前后有注释掉的sql都会报错,那注释这个功能在这还有毛用???/捂脸/捂脸...
-
【java项目实战】dom4j解析xml文件,连接Oracle数据库
-
用PHP工具包expat解析XML_PHP教程
-
php文件用什么打开 PHP文件读写操作之文件写入代码
-
用Ajax读取xml文件的简单例子
-
用ASP+XML打造留言本(2)
-
这里为啥用xml来实现呢
-
php 读取xml的方法三---用php正则表达式来记取数据