zoukankan      html  css  js  c++  java
  • XML的DOM解析 Java实现 使用递归解析一个XML文档

     

    XML的DOM解析 Java实现 使用递归解析一个XML文档

      本文是一个练习程序,程序解析了一个XML文档,并将其原样输出在命令行上。

      因为要把程序设计成适用于任何XML文档,所以需要使用递归,其中还必须加入元素类型的判断。

      详见程序:

      本文使用的XML文档:

    <?xml version="1.0" encoding="UTF-8"?>
    <学生名册 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="C:\Course30\student.xsd">
        <!-- 注释:学生1 -->
        <学生 学号="1">
            <姓名>张三</姓名>
            <性别></性别>
            <年龄>20</年龄>
        </学生>
        <学生 学号="2">
            <姓名>李四</姓名>
            <性别></性别>
            <年龄>19</年龄>
        </学生>
        <学生 学号="3">
            <姓名>王五</姓名>
            <性别></性别>
            <年龄>21</年龄>
        </学生>
    </学生名册>

      Java程序:

    package com.learnjava.xml.dom;
    
    import java.io.File;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    
    import org.w3c.dom.Attr;
    import org.w3c.dom.Comment;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.NamedNodeMap;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    
    /**
     * 使用递归解析一个XML文档并且将其内容输出到命令行上
     * 
     */
    public class DomTest3
    {
        public static void main(String[] args) throws Exception
        {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(new File("student.xml"));
    
            // 获取根元素节点
            Element root = doc.getDocumentElement();
    
            parseElement(root);
        }
    
        private static void parseElement(Element element)
        {
            String tagName = element.getNodeName();
    
            System.out.print("<" + tagName);
    
            // element元素的所有属性构成的NamedNodeMap对象,需要对其进行判断
            NamedNodeMap map = element.getAttributes();
    
            // 如果存在属性,则打印属性
            if (null != map)
            {
                for (int i = 0; i < map.getLength(); i++)
                {
                    // 获得该元素的每一个属性
                    Attr attr = (Attr) map.item(i);
    
                    // 属性名和属性值
                    String attrName = attr.getName();
                    String attrValue = attr.getValue();
    
                    // 注意属性值需要加上引号,所以需要\转义
                    System.out.print(" " + attrName + "=\"" + attrValue + "\"");
                }
            }
    
            // 关闭标签名
            System.out.print(">");
    
            // 至此已经打印出了元素名和其属性
            // 下面开始考虑它的子元素
            NodeList children = element.getChildNodes();
    
            for (int i = 0; i < children.getLength(); i++)
            {
    
                // 获取每一个child
                Node node = children.item(i);
                // 获取节点类型
                short nodeType = node.getNodeType();
    
                if (nodeType == Node.ELEMENT_NODE)
                {
                    // 如果是元素类型,则递归输出
                    parseElement((Element) node);
                }
                else if (nodeType == Node.TEXT_NODE)
                {
                    // 如果是文本类型,则输出节点值,及文本内容
                    System.out.print(node.getNodeValue());
                }
                else if (nodeType == Node.COMMENT_NODE)
                {
                    // 如果是注释,则输出注释
                    System.out.print("<!--");
    
                    Comment comment = (Comment) node;
    
                    // 注释内容
                    String data = comment.getData();
    
                    System.out.print(data);
    
                    System.out.print("-->");
                }
            }
    
            // 所有内容处理完之后,输出,关闭根节点
            System.out.print("</" + tagName + ">");
        }
    }

    参考资料

      圣思园张龙老师视频教程。

      Java官方文档:http://docs.oracle.com/javase/7/docs/api/index.html

  • 相关阅读:
    volley框架使用
    Insert Interval
    candy(贪心)
    Best Time to Buy and Sell Stock
    Best Time to Buy and Sell Stock III
    distinct subsequences
    edit distance(编辑距离,两个字符串之间相似性的问题)
    trapping rain water
    word break II(单词切分)
    sudoku solver(数独)
  • 原文地址:https://www.cnblogs.com/mengdd/p/3113459.html
Copyright © 2011-2022 走看看