Java中解析xml的方式

Java中解析xml的方式

1. Java中JDK自带方式

package xml;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.ByteArrayOutputStream;

/**
 * @author wyp
 */
public class XmlTest {
    public static void main(String[] args) throws ParserConfigurationException, TransformerException {
        jdkXml();
    }

    public static void jdkXml() throws ParserConfigurationException, TransformerException {
        // 得到DOM解析器工厂
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        // 从解析器工厂的解析器得到Document对象
        DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder();
        Document document = documentBuilder.newDocument();
        // 设置文件头
        document.setXmlStandalone(true);
        // 创建根元素
        Element rootElement = document.createElement("request");
        // 创建子元素
        Element userElement = document.createElement("user");
        // 为子元素添加属性
        userElement.setAttribute("mark","xc");
        // 创建子子元素
        Element idElement = document.createElement("id");
        Element nameElement = document.createElement("name");
        Element ageElement = document.createElement("age");
        Element hobbyElement = document.createElement("hobby");
        // 为子子元素添加数据值
        idElement.setTextContent("01");
        nameElement.setTextContent("张三");
        ageElement.setTextContent("24");
        hobbyElement.setTextContent("[唱歌, 跳舞]");
        // 将子子元素添加到子元素下
        userElement.appendChild(idElement);
        userElement.appendChild(nameElement);
        userElement.appendChild(ageElement);
        userElement.appendChild(hobbyElement);
        // 将子元素添加到根元素下
        rootElement.appendChild(userElement);
        // 将根元素添加到Document对象中
        document.appendChild(userElement);

        // 创建TransformerFactory对象
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        // 创建Transformer对象
        Transformer transformer = transformerFactory.newTransformer();
        // 输出内容是否使用换行
        transformer.setOutputProperty(OutputKeys.INDENT,"no");
        // 创建字节数组输出流
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        // 写入内容
        transformer.transform(new DOMSource(document),new StreamResult(byteArrayOutputStream));
        // 获取xml的字符串形式
        String xmlString = byteArrayOutputStream.toString();
        System.out.println(xmlString);

    }
}

输出结果:

<?xml version="1.0" encoding="UTF-8"?><user mark="xc"><id>01</id><name>张三</name><age>24</age><hobby>[唱歌, 跳舞]</hobby></user>

2. Dom4j的方式

Dom4j官方文档:https://dom4j.github.io/

添加依赖

<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
<dependency>
    <groupId>org.dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>2.1.3</version>
</dependency>
常用方法:
  • 创建document对象:DocumentHelper.createDocument()
  • 添加标签:document.addElement(String name)
  • 添加标签中属性:element.addAttribute(String name, String value)
  • 添加标签里的内容:element.addText(String text)
  • document转字符串:document.asXML()
  • 字符串转document:DocumentHelper.parseText(String text)
  • 获取根元素:document.getRootElement
  • 获取节点名称:element.getName()
  • 获取节点属性值:element.attribute(String name)
  • 获取节点下的某一结点:element.element(String name)
  • 获取节点的内容:element.getText()
  • 子元素迭代:Iterator<Element> elementIterator()
  • 元素属性迭代:Iterator<Attribute> attributeIterator()

OutputFormat类用于格式化输出的xml。

  • 紧凑格式:OutputFormat.createCompactFormat()
  • 美化格式:OutputFormat.createPrettyPrint()
  • 设置缩进:format.setIndentSize(int indentSize)
  • 换行:format.setNewlines(true)
  • 去空格:format.setTrimText(true)

具体用法请参考以下示例

示例
package xml;

import org.dom4j.*;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;

/**
 * @author wyp
 */
public class DomXml {
    public static void main(String[] args) throws IOException, DocumentException {
        
    }

    /**
     * 创建XML文档
     */
    public static Document createDocument() {
        Document document = DocumentHelper.createDocument();
        Element root = document.addElement("user")
                .addAttribute("mark", "xc");
        root.addElement("id")
                .addText("01");
        root.addElement("name")
                .addText("张三");
        root.addElement("age")
                .addText("24");
        root.addElement("hobby")
                .addText("[唱歌, 跳舞]");
        return document;
    }

    /**
     * 打印紧凑格式的xml
     */
    public static void printCompactFormat() throws IOException {
        //用于创建默认紧凑格式的静态辅助方法。此格式在元素和所有其他空白修剪后没有任何缩进或换行符
        OutputFormat format = OutputFormat.createCompactFormat();
        XMLWriter xmlWriter = new XMLWriter(System.out, format);
        //以format格式打印
        xmlWriter.write(createDocument());
        xmlWriter.close();
    }

    /**
     * 打印漂亮的格式的xml
     */
    public static void printPrettyFormat() throws IOException {
        //用于创建默认漂亮打印格式的静态辅助方法。此格式包含 2 个空格的缩进、每个元素后的换行符以及所有其他空格修剪,并且 XMTML 为假
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter xmlWriter = new XMLWriter(System.out, format);
        //以format格式打印
        xmlWriter.write(createDocument());
        xmlWriter.close();
    }


    /**
     * 将xml写入文件
     */
    public static void writeToXml() {
        try(FileWriter out = new FileWriter("foo.xml");) {
            createDocument().write(out);
        } catch (IOException e){
            e.printStackTrace();
        }
    }

    /**
     * 将xml写入文件
     */
    public static void writeToXml1() throws IOException {
        try(FileWriter out = new FileWriter("foo1.xml");) {
            //设置格式
            OutputFormat format = new OutputFormat();
            format.setIndentSize(4); //缩进为4
            format.setNewlines(true);   //换行
            format.setTrimText(true);   //去除空格
            XMLWriter xmlWriter = new XMLWriter(out,format);
            xmlWriter.write(createDocument());
            xmlWriter.close();
        }
    }

    /**
     * 字符串与document之间的转换
     */
    public static void strDocExchange() throws DocumentException {
        //document转字符串
        String s = createDocument().asXML();
        System.out.println(s);

        //字符串转document
        Document document = DocumentHelper.parseText(s);
    }

    /**
     * 读取并解析xml文件
     */
    public static Document parseXmlFile() throws FileNotFoundException, DocumentException {
        SAXReader reader = new SAXReader();
        FileReader fileReader = new FileReader("foo.xml");
        return reader.read(fileReader);
    }

    /**
     * 解析xml document
     */
    public static void parseXmlDocument() {
        Document document = createDocument();
        Element root = document.getRootElement();
        //获取结点名
        System.out.println(root.getName());
        //获取结点中的某个属性值
        System.out.println(root.attribute("mark").getText());
        //获取root结点下的name结点
        Element name = root.element("name");
        //获取该结点下的内容
        System.out.println(name.getText());
        //迭代器获取root结点下的所有结点
        Iterator<Element> elementIterator = root.elementIterator();
        while (elementIterator.hasNext()) {
            Element next = elementIterator.next();
            System.out.println(next.getName() + "-" + next.getText());
        }
        //迭代器获取root结点下的所有属性
        Iterator<Attribute> attributeIterator = root.attributeIterator();
        while (attributeIterator.hasNext()) {
            Attribute next = attributeIterator.next();
            System.out.println(next.getName() + "-" + next.getText());
        }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小辰~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值