[相关解析]-- java解析xml文件的四种方式

目前解析xml有4种方式:

一、DOM解析(此处介绍读文件的方式,暂未提供写入的方式)

1、不需要架包,jdk自带工具

2、创建dom.xml文件和ResoveDom.java

dom.xml文件内容如下

<?xml version="1.0" encoding="UTF-8"?>
<book>
    <bookname name="XML详解" font="GB2312"></bookname>
    <authors>
        <author name="张孝祥" sex="男" age="45"></author>
                <author name="王勇" sex="男" age="35"></author>
        <author name="王波" sex="男" age="30"></author>
    </authors>
    <price value="$55"></price>
    <publishdate>
        <value>2015-08-28</value>
    </publishdate>
</book>

java代码如下

package com.test.dom;


import java.io.FileInputStream;


import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;


import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


//DOM解析Xml文件。
public class ResolveDom {
@Test
public void testDom2(){
testDom();
}

public static void testDom() {
try {
// 读取文件到内存
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder dbd = dbf.newDocumentBuilder();
Document doc = dbd.parse(new FileInputStream("src/dom.xml"));
// 通过XML获得authors的authors子节点列表
XPathFactory f = XPathFactory.newInstance();
XPath path = f.newXPath();
NodeList authors = (NodeList) path.evaluate("book/authors/author", doc, XPathConstants.NODESET);
// 获得子节点长度(authors中有多少个author)
System.out.println(authors.getLength());


// 获取authors的第一个子节点
Node author = (Node) path.evaluate("book/authors/author", doc, XPathConstants.NODE);
System.out.println("名称:" + author.getNodeName());
System.out.println("内容:" + author.getTextContent());// 如果不存在则返回null,有则返回内容

//获取节点属性
NamedNodeMap attr=author.getAttributes();
System.out.println("该节点的属性个数"+attr.getLength());

//遍历元素的属性
if(attr!=null){
for(int i=0;i<attr.getLength();i++){
int n=i+1;
System.out.println("属性"+n+"名称:"+attr.item(i).getNodeName());
System.out.println("值:"+attr.item(i).getNodeValue());
System.out.println("类型:"+attr.item(i).getNodeType());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

 

二、Dom4j解析 (需要架包dom4j.jar)

        1、导入架包:dom4j-1.6.1.jar

        2、新建一个XMl文件,c2.xml和XmlResoleDom4j.java文件

3、测试

c2.xml文件内容举例

<?xml version="1.0" encoding="UTF-8"?>
<user>
  <name>王五</name>
  <age>13</age>
  <id>23</id>
</user>

 XmlResoleDom4j.java文件内容如下

package com.test.dom4j;
import java.io.File;  
import java.io.FileOutputStream;  
import java.io.OutputStreamWriter;  
  
import org.dom4j.Document;  
import org.dom4j.DocumentHelper;  
import org.dom4j.Element;  
import org.dom4j.io.OutputFormat;  
import org.dom4j.io.SAXReader;  
import org.dom4j.io.XMLWriter;  
import org.junit.Test; 


//字符串与XML互转换案例
public class XmlResoleDom4j {
/**
* 读取xml文件内容
* @throws Exception
*/
@Test  
   public void test() throws Exception {  
 
       // 创建saxreader对象  
       SAXReader reader = new SAXReader();  
       // 读取一个文件,把这个文件转换成Document对象  
       Document document = reader.read(new File("src/c2.xml"));  
       // 获取根元素  
       Element root = document.getRootElement();  
       // 把文档转换字符串  
       String docXmlText = document.asXML();  
       System.out.println(docXmlText);    //打印文件的所有内容
       System.out.println("---------------------------");  
       //user元素标签根转换的内容  
       String rootXmlText = root.asXML();  
       System.out.println(rootXmlText);  //打印文件具有标签的所有内容
       System.out.println("---------------------------");  
       Element e = root.element("name");// 获取xml文件中name元素标签 内的内容  
       Element e2=root.element("age");  //获取xml文件中age元素标签的内容
       System.out.println(e.asXML());  
       System.out.println(e2.asXML());
 
   }  
 
   /** 
    * 第一种:创建一个document对象 往document对象中添加节点元素 转存为xml文件 
    *  
    * @throws Exception 
    */  
   @Test
   public void test2() throws Exception {  
 
       Document document = DocumentHelper.createDocument();
       // 创建根节点 并且加入元素
       Element root = document.addElement("user");  
       Element java = root.addElement("name");  
       java.setText("王五");  
       Element ios = root.addElement("age");  
       ios.setText("13");  
 
       writeXml(document);  
   }  
 
   /** 
    * 第二种:把一个文本字符串转换Document对象 ,然后写入xml文件
    *  
    * @throws Exception 
    */  
   @Test
   public void test1() throws Exception {  
    //将要写入的字符串,如果是一个集合,那么使用循环然后拼接即可
       String text = "<user><id>1</id><name>张三</name><age>22</age></user>";  
       Document document = DocumentHelper.parseText(text);  
       Element e = document.getRootElement();  
       //打印标签名称csdn
       System.out.println(e.getName());  
       //调用方法写入文件
       writeXml(document);  
   }  
 
   
   /** 
    * 将document对象写入新的文件(xml文件) 
    *  
    * @param document 
    * @throws Exception 
    */  
   public static void writeXml(Document document) throws Exception {  
       // 紧凑的格式  
       // OutputFormat format = OutputFormat.createCompactFormat();  
       // 排版缩进的格式  
       OutputFormat format = OutputFormat.createPrettyPrint();  
       // 设置编码  
       format.setEncoding("UTF-8");  
       // 创建XMLWriter对象,指定了写出文件及编码格式  
       XMLWriter writer = new XMLWriter(new OutputStreamWriter(  
               new FileOutputStream(new File("src//c2.xml")), "UTF-8"), format);  
       // 写入  
       writer.write(document);  
       // 立即写入  
       writer.flush();  
       // 关闭操作  
       writer.close();  
   }  
}

4、针对多个标签的写入

(1)xml文件:dom4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<四大名著>
<西游记 id="x001">  
        <作者>吴承恩1</作者>  
         <朝代>明朝</朝代>  
    </西游记>  
    <红楼梦 id="x002">  
        <作者>曹雪芹</作者>  
    </红楼梦> 
    <三国演义 id="x003">
    <作者>罗贯中</作者>
    </三国演义>
</四大名著>    

       (2)测试的java文件

package com.test.dom4j;


import java.io.File;  
import java.io.FileOutputStream;  
import java.io.OutputStreamWriter;  
import java.util.Iterator;  
import java.util.List;  
  
import org.dom4j.Attribute;  
import org.dom4j.Document;  
import org.dom4j.Element;  
import org.dom4j.io.OutputFormat;  
import org.dom4j.io.SAXReader;  
import org.dom4j.io.XMLWriter; 
import org.junit.Test;


public class ResolveDom4j {
@Test  
    public void test() throws Exception {  
        // 创建saxReader对象  
        SAXReader reader = new SAXReader();  
        // 通过read方法读取一个文件 转换成Document对象  
        Document document = reader.read(new File("src/dom4j.xml"));  
        //获取根节点元素对象  
        Element node = document.getRootElement();  
        //读取dom4j.xml文件中所有元素
        listNodes(node);  
  
        // 获取四大名著元素节点中,子节点名称为红楼梦元素节点。  
        Element element = node.element("红楼梦");  
        //获取element的id属性节点对象  
        Attribute attr = element.attribute("id");  
        //删除属性  
        element.remove(attr);  
        //添加新的属性  
        element.addAttribute("name", "作者");  
        // 在红楼梦元素节点中添加朝代元素的节点  
        Element newElement = element.addElement("朝代");  
        newElement.setText("清朝");  
        //获取element中的作者元素节点对象  
        Element author = element.element("作者");  
        //删除元素节点  
        boolean flag = element.remove(author);  
        //返回true代码删除成功,否则失败  
        System.out.println(flag);  
        //添加CDATA区域  
        element.addCDATA("红楼梦,是一部爱情小说.");  
        // 写入到一个新的文件中  
        writer(document);  
  
    }  
  
    /** 
     * 把document对象写入新的文件 
     *  
     * @param document 
     * @throws Exception 
     */  
    public void writer(Document document) throws Exception {  
        // 紧凑的格式  
        // OutputFormat format = OutputFormat.createCompactFormat();  
        // 排版缩进的格式  
        OutputFormat format = OutputFormat.createPrettyPrint();  
        // 设置编码  
        format.setEncoding("UTF-8");  
        // 创建XMLWriter对象,指定了写出文件及编码格式  
        // XMLWriter writer = new XMLWriter(new FileWriter(new  
        // File("src//a.xml")),format);  
        XMLWriter writer = new XMLWriter(new OutputStreamWriter(  
                new FileOutputStream(new File("src//a.xml")), "UTF-8"), format);  
        // 写入  
        writer.write(document);  
        // 立即写入  
        writer.flush();  
        // 关闭操作  
        writer.close();  
    }  
  
   //节点内容
    public void listNodes(Element node) {  
        System.out.println("当前节点的名称::" + node.getName());  
        // 获取当前节点的所有属性节点  
        List<Attribute> list = node.attributes();  
        // 遍历属性节点  
        for (Attribute attr : list) {  
            System.out.println(attr.getText() + "-" + attr.getName()  
                    + "---" + attr.getValue());  
        }  
       //如果文本内容不是空,则打印
        if (!(node.getTextTrim().equals(""))) {  
            System.out.println("文本内容::::" + node.getText());  
        }  
        // 当前节点下面子节点迭代器  
        Iterator<Element> it = node.elementIterator();  
        // 遍历  
        while (it.hasNext()) {  
            // 获取某个子节点对象  
            Element e = it.next();  
            // 对子节点进行遍历  
            listNodes(e);  
        }  
    }  
  
    /** 
     * 根据标签元素名称获取内容
     */  
    public void elementMethod(Element node) {  
        // 获取node节点中,子节点的元素名称为西游记的元素节点。  
        Element e = node.element("西游记");  
        // 获取西游记元素节点中,子节点为作者的元素节点(可以看到只能获取第一个作者元素节点)  
        Element author = e.element("作者");  
        System.out.println(e.getName() + "----" + author.getText());  
        // 获取西游记这个元素节点 中,所有子节点名称为作者元素的节点 。  
        List<Element> authors = e.elements("作者");  
        for (Element aut : authors) {  
            System.out.println(aut.getText());  
        }  
        // 获取西游记这个元素节点 所有元素的子节点。  
List<Element> elements = e.elements();  
        for (Element el : elements) {  
            System.out.println(el.getText());  
        }  
    }  
}

三、SAX(simple ApIs for xml)

四、JDOM解析(需要架包jdom.jar)

注意:由于三和四基本不用,所以本文暂未介绍

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

往事随风ing

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值