欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java使用dom方式解析和操作xml,递归解析xml以yml格式输出

程序员文章站 2022-03-27 12:56:15
题目1. 编写程序,解析score.xml文件,要求输出的结果如图1所示。2.编写程序,修改下面的XML文件book.xml,要求:(1)为每一个book元素添加一个author子元素,元素内容自定。(2)修改title元素的值,在文本内容的后面添加文本“(电子工业出版社)”。 例如: Java面向对象编程 变为: Java面向对象编程(电子工业出版社)......

题目

1. 编写程序,解析score.xml文件,要求输出的结果如图1所示。

Java使用dom方式解析和操作xml,递归解析xml以yml格式输出

2. 编写程序,修改下面的XML文件book.xml,要求:

(1)为每一个book元素添加一个author子元素,元素内容自定。

(2)修改title元素的值,在文本内容的后面添加文本“(电子工业出版社)”。    例如:

<title> Java面向对象编程</title>      变为:<title> Java面向对象编程(电子工业出版社)</title>

(3)删除原有的第三个<book>元素。

(4)为每一个book元素添加一个category属性子元素,元素内容自定,如:<book  category="computer">

(5)使用DOM接口,javascript语言实现。

score.xml

<?xml version="1.0" encoding="UTF-8"?>
<score>
	<name id="001" rand="358">
	    <alias>张三</alias>
		<math>89</math>
		<english>90</english>
	</name>
	<name id="002" rand="sdg">
		<alias test="bjkzxv" class="dsvskl">李四</alias>
		<math>92</math>
		<english>87</english>
	</name>
	<name id="003" rand="sdgsd">
		<alias>王五</alias>
		<math>95</math>
		<english>90</english>
	</name>
</score>

book.xml

<?xml version="1.0" encoding="utf-8" ?>
<books>
	<book>
		<title>Java面向对象编程</title>
	</book>
	<book>
		<title>JSP动态网页编程技术</title>
	</book>
	<book>
		<title>精通Hibernate</title>
	</book>
</books>

效果截图

解析 book1.xml ,以 yml 格式在控制台输出

Java使用dom方式解析和操作xml,递归解析xml以yml格式输出 Java使用dom方式解析和操作xml,递归解析xml以yml格式输出

代码

XmlOperator.java

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

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.File;
import java.io.IOException;

/**
 * @author passerbyYSQ
 * @create 2020-12-01 10:34
 */
public class XmlOperator {

    /**
     * 读取xml文件,创建document对象
     *
     * @param file
     * @return
     * @throws ParserConfigurationException
     * @throws IOException
     * @throws SAXException
     */
    public static Document createDocument(File file) throws ParserConfigurationException,
            IOException, SAXException {
        // 获取工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 获取builder
        DocumentBuilder builder = factory.newDocumentBuilder();
        // 解析xml文件
        Document document = builder.parse(file);
        return document;
    }

    /**
     * 将document对象保存成xml文件
     *
     * @param document
     * @param dest
     * @throws TransformerException
     */
    public static void saveToXmlFile(Document document, File dest) throws TransformerException {
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource domSource = new DOMSource(document);
        //设置编码类型
        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        // 设置缩进
        //transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        // 保存位置
        StreamResult result = new StreamResult(dest);
        //把DOM树转换为xml文件并保存
        transformer.transform(domSource, result);
    }

    /**
     * 解析xml文件,以yml格式打印在控制台
     *
     * @param document
     * @param outerNodeName
     */
    public static void toYml(Document document, String outerNodeName) {

        // 最外层结点(一般来说,根节点只有一个。但这里允许最外层结点有多个并列)
        NodeList outerNodeList = document.getElementsByTagName(outerNodeName);

        for (int i = 0; i < outerNodeList.getLength(); i++) {
            Node outNode = outerNodeList.item(i);
            String nodeName = outNode.getNodeName();
            System.out.print(nodeName);

            // 拼接属性
            NamedNodeMap attributes = outNode.getAttributes();
            String attrsStr = joinAttributes(attributes);
            System.out.print(attrsStr);

            // 递归遍历子节点
            NodeList childNodes = outNode.getChildNodes();
            parseByRecursion(childNodes, 1);
        }
    }

    // 递归解析子节点
    private static void parseByRecursion(NodeList nodeList, Integer level) {
        if (nodeList == null || nodeList.getLength() == 0) {
            return;
        }

        for (int i = 0; i < nodeList.getLength(); i++) {
            Node node = nodeList.item(i);

            if (node.getNodeType() == Node.TEXT_NODE) {
                // Node.TEXT_NODE的getTextContent()和getNodeValue()一样
                // Node.ELEMENT_NODE的getTextContent()是当前标签里面的xml代码,getNodeValue()为null,
                String text = node.getTextContent();

                if (!"".equals(text.trim())) {
                    System.out.print(": " + text);
                }
            } else if (node.getNodeType() == Node.ELEMENT_NODE) {
                String nodeName = node.getNodeName();
                System.out.println();
                for (int j = 0; j < level; j++) {
                    System.out.print("\t");
                }
                System.out.print(nodeName);

                // 拼接属性
                NamedNodeMap attributes = node.getAttributes();
                String attrsStr = joinAttributes(attributes);
                System.out.print(attrsStr);

                // 递归
                parseByRecursion(node.getChildNodes(), level + 1);
            }
        }
    }

    // 拼接属性
    private static String joinAttributes(NamedNodeMap attributes) {
        if (attributes.getLength() == 0) {
            return "";
        }

        StringBuilder sbd = new StringBuilder();
        sbd.append("[");
        for (int i = 0; i < attributes.getLength(); i++) {
            Node attr = attributes.item(i);
            sbd.append(attr.getNodeName())
                    .append("=")
                    .append(attr.getNodeValue());
            if (i < attributes.getLength() - 1) {
                sbd.append(",");
            }
        }
        sbd.append("]");
        return sbd.toString();
    }


}

TestWork.java

import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import java.io.*;
import java.net.URL;
import java.util.UUID;

/**
 * @author passerbyYSQ
 * @create 2020-12-01 10:55
 */
public class TestWork {

    private static Document document;

    static {
        // 获取工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        File file = new File("E:\\Java\\IdeaProjects\\XmlOparate\\src\\demo\\book.xml");

        try {
            DocumentBuilder builder = factory.newDocumentBuilder();
            document = builder.parse(file);
        } catch (ParserConfigurationException | SAXException | IOException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void test2() {
        XmlOperator.toYml(document, "books");
    }

    /**
     * 编写程序,修改下面的XML文件Book.xml,要求:
     * (1)为每一个book元素添加一个author子元素,元素内容自定。
     * (2)修改title元素的值,在文本内容的后面添加文本"(电子工业出版社)"。    例如:
     * 	<title> Java面向对象编程</title>      变为:
     * 	<title> Java面向对象编程(电子工业出版社)</title>
     *  (3)删除原有的第三个<book>元素。
     *  (4)为每一个book元素添加一个category属性子元素,元素内容自定,如:<book  category="computer">
     *  (5)使用DOM接口,javascript语言实现。
     */
    @Test
    public void test3() throws TransformerException {
        //(1)为每一个book元素添加一个author子元素,元素内容自定。
        //(4)为每一个book元素添加一个category属性子元素,元素内容自定,如:<book  category="computer">
        NodeList bookNodeList = document.getElementsByTagName("book");
        for (int i = 0; i < bookNodeList.getLength(); i++) {
            Node bookNode = bookNodeList.item(i);
            // 创建author子节点
            Element authorNode = document.createElement("author");
            authorNode.setTextContent("author" + i);
            // 添加子节点
            bookNode.appendChild(authorNode);

            Element element = (Element) bookNode;
            element.setAttribute("category", "cate" + i);//设置属性load="false"
        }

        // (2)修改title元素的值,在文本内容的后面添加文本"(电子工业出版社)"
        NodeList titleNodeList = document.getElementsByTagName("title");
        for (int i = 0; i < titleNodeList.getLength(); i++) {
            Node titleNode = titleNodeList.item(i);
            String textContent = titleNode.getTextContent();
            //System.out.println(textContent);
            titleNode.setTextContent(textContent + "(电子工业出版社)");
        }

        //(3)删除原有的第三个<book>元素。
        Node item = bookNodeList.item(2);
        item.getParentNode()
                .removeChild(item);

        XmlOperator.toYml(document, "books");

        File destFile = new File("E:\\Java\\IdeaProjects\\XmlOparate\\src\\demo\\book1.xml");
        XmlOperator.saveToXmlFile(document, destFile);
    }

}

 

本文地址:https://blog.csdn.net/qq_43290318/article/details/110436888