文档章节

XML Utility

markGao
 markGao
发布于 2013/12/31 11:38
字数 830
阅读 26
收藏 0
package sample;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import java.io.StringReader;
import java.io.Writer;

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.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

/**
 * XML utility class.
 * 
 * @author $Author: Lihong Gao $
 */
public final class XMLUtil {

    /** Hide default constructor */
    private XMLUtil() {
    }

    /**
     * Selects single node specified by the XPath expression.
     * 
     * @param current
     *            XPath query root node
     * @param xpath
     *            XPath expression
     * @return Selected node
     * @throws AIUException
     *             Indicates more than one nodes are selected
     */
    public static Node selectSingleNode(Node current, String xpath)
            throws Exception {
        // final String method = "selectSingleNode(Node,String)";

        NodeList list = selectNodes(current, xpath);
        if (list == null || list.getLength() == 0) {
            return null;
        } else if (list.getLength() == 1) {
            return list.item(0);
        } else {
            throw new Exception("More than one nodes are selected");
        }
    }

    /**
     * Selects list of nodes specified by the XPath expression.
     * 
     * @param current
     *            XPath query root node
     * @param xpath
     *            XPath expression
     * @return Selected node list
     * @throws AIUException
     *             Indicates XML transform failure
     */
    public static NodeList selectNodes(Node current, String xpath)
            throws Exception {
        // final String method = "selectNodes(Node,String)";

        if (current instanceof Element && xpath.indexOf('/') == -1
                && xpath.indexOf('[') == -1) {
            return ((Element) current).getElementsByTagName(xpath);
        } else {
            String xltString = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
                    + "<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">"
                    + "<xsl:output version=\"1.0\" method=\"xml\" encoding=\"utf-8\" />"
                    + "<xsl:template match=\"" + xpath + "\">"
                    + "<xsl:copy-of select=\".\" />" + "</xsl:template>"
                    + "<xsl:template match=\"text()\"/>" + "</xsl:stylesheet>";

            try {
                Element result = (Element) current.cloneNode(false);
                StreamSource template = new StreamSource(new StringReader(
                        xltString));

                TransformerFactory transformerFactory = TransformerFactory
                        .newInstance();
                Transformer transformer = transformerFactory
                        .newTransformer(template);
                transformer.transform(new DOMSource(current), new DOMResult(
                        result));
                return result.getChildNodes();
            } catch (TransformerException ex) {
                throw new Exception(ex.getMessage(), ex);
            }
        }
    }

    /**
     * Retrieves text node values as text recursively.
     * 
     * @param root
     *            Root node
     * @param xpath
     *            XPath expression
     * @return String representation of text nodes
     * @throws Exception
     *             Indicates more than one nodes are selected
     */
    public static String getTextValue(Node root, String xpath) throws Exception {
        StringBuffer buf = new StringBuffer();

        Node node = selectSingleNode(root, xpath);
        if (node == null) {
            return null;
        }

        NodeList children = node.getChildNodes();
        for (int i = 0; i < children.getLength(); i++) {
            Node child = children.item(i);
            if (child.getNodeType() == Node.TEXT_NODE) {
                buf.append(child.getNodeValue());
            }
        }

        return buf.toString();
    }

    /**
     * Removes all elements specified by element name.
     * 
     * @param node
     *            Node to modify
     * @param name
     *            Element name
     */
    public static void removeNode(Node node, String name) {
        NodeList nodes = ((Element) node).getElementsByTagName(name);
        if (nodes != null) {
            for (int i = 0; i < nodes.getLength(); i++) {
                node.removeChild(nodes.item(i));
            }
        }
    }

    /**
     * Exports DOM node tree to specified output stream.
     * 
     * @param root
     *            Root node
     * @param out
     *            Output writer
     * @throws Exception
     *             Indicates failed to export nodes
     */
    public static void exportNodes(Node root, Writer out) throws Exception {
        exportNodes(root, new StreamResult(out));
    }

    /**
     * Exports DOM node tree to specified output stream.
     * 
     * @param root
     *            Root node
     * @param out
     *            Output stream
     * @throws Exception
     *             Indicates failed to export nodes
     */
    public static void exportNodes(Node root, OutputStream out)
            throws Exception {
        exportNodes(root, new StreamResult(out));
    }

    /**
     * Exports DOM node tree to specified output stream.
     * 
     * @param root
     *            Root node
     * @param result
     *            Result
     * @throws Exception
     *             Indicates failed to export nodes
     */
    public static void exportNodes(Node root, StreamResult result)
            throws Exception {
        // final String method = "exportNodes(Node,OutputStream)";
        final String xltString = "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>"
                + "<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">"
                + "<xsl:output method=\"xml\" version=\"1.0\" encoding=\"Shift_JIS\" omit-xml-declaration=\"yes\" />"
                + "<xsl:template match=\"*\">"
                + "<xsl:copy-of select=\".\" />"
                + "</xsl:template>" + "</xsl:stylesheet>";

        try {
            StreamSource template = new StreamSource(
                    new StringReader(xltString));
            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer transformer = factory.newTransformer(template);
            transformer.setOutputProperty(OutputKeys.ENCODING, "Shift_JIS");
            transformer.transform(new DOMSource(root), result);
        } catch (TransformerException ex) {
            throw new TransformerException(ex.getMessage(), ex);
        }
    }

    /**
     * Converts Node to Document.
     * 
     * @param node
     *            Node
     * @return Document
     * @throws Exception
     *             Indicates failed to convert.
     */
    public static Document convertToDocument(Node node) throws Exception {
        Document doc = createDocument();
        doc.appendChild(doc.importNode(node, true));
        return doc;
    }

    /**
     * Constructs new Document.
     * 
     * @return Document
     * @throws Exception
     *             Indicates failed to convert.
     */
    public static Document createDocument() throws Exception {
        // final String method = "createDocument()";
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory
                    .newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            return builder.newDocument();
        } catch (DOMException e) {
            throw new DOMException(ISeverityLevels.IMPORTANT, e.getMessage());
        } catch (ParserConfigurationException e) {
            throw new ParserConfigurationException(e.getMessage());
        }
    }

    /**
     * Parses specified XML and returns constructed document.
     * 
     * @param xml
     *            XML to parse
     * @return Document
     * @throws Exception
     *             Indicates failed to convert.
     */
    public static Document parseDocument(String xml) throws Exception {
        // final String method = "parseDocument(String)";
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory
                    .newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            return builder.parse(new InputSource(new StringReader(xml)));
        } catch (IOException e) {
            throw new IOException(e.getMessage(), e);
        } catch (DOMException e) {
            throw new DOMException(ISeverityLevels.IMPORTANT, e.getMessage());
        } catch (ParserConfigurationException e) {
            throw new ParserConfigurationException(e.getMessage());
        } catch (SAXException e) {
            throw new SAXException(e.getMessage(), e);
        }
    }

    public interface ISeverityLevels {
        // severity levels for Exceptions and Logging
        public final static short CRITICAL = 1;
        public final static short IMPORTANT = 4;
        public final static short WARNING = 7;
        public final static short INFORMATIONAL = 10;
        public final static short DEBUG = 13;
        public final static short VERBOSE = 16;
    }

    public static String getXmlString(String inFilename) throws Exception {
        StringBuffer sb = new StringBuffer();
        BufferedReader reader = new BufferedReader(new FileReader(new File(
                inFilename)));
        try {
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
            return sb.toString();
        } finally {
            reader.close();
        }
    }

}


© 著作权归作者所有

共有 人打赏支持
markGao
粉丝 15
博文 187
码字总数 91352
作品 0
宝山
程序员
私信 提问
四种Sandcastle方法生成帮助类帮助文档

方法一、Visual Studio新建documentation生成帮助文档 前段时间在网上收集和自己平时工作总结整理了《干货,比较全面的c#.net公共帮助类》,整理完成上传github之后我又想,既然是帮助类,总得...

安与生_
2017/10/18
0
0
xmlObjectifier

The end of DOM Tree walking is here! This small and fast utility converts an XML file fetched through $.ajax to a JavaScript Object, completely eliminating a need to use DOM Tre......

匿名
2008/09/19
449
0
XMLFoundation April 2014 发布

XMLFoundation April 2014 发布,此版本更新内容如下: run the Microsoft Code Analysis in MSDev2012, reviewed all output, silenced some warnings, and added a few if(!Null) checks ......

oschina
2014/04/10
386
0
Yahoo javascript 开源界面库YUI 和EXT

清清月儿整理 [yui][译]Yahoo!User Interface Libray 介绍 Yahoo! User Interface Library(简称yui) 是一个使用JavaScript编写的工具和控件库。它利用DOM脚本,DHTML和AJAX来构造具有丰富交互...

晨曦之光
2012/03/09
362
0
在Eclipse下 Ant打包报错

这个是build.xml源文件 java:comp/UserTransaction C:\\tmp C:\\EDI_SHDG_HOME_VAR C:\\EDI_RECEIVE_VAR C:\\EDI_SHDG_TRANS_HOME_VAR C:\\EDI_DOC_UIF_HOME_VAR C:\\EDI_LCL_BKG_UIF_HOME_......

時間會抹平那些皺褶遺
2015/08/11
907
1

没有更多内容

加载失败,请刷新页面

加载更多

如何解决 homebrew 更新慢的问题

之前一直困扰于 Homebrew 的更新速度,曾试过修改更新源(清华、中科大等)的方式,但是并没什么卵用;也试过设置 curl 代理的方式,但是 brew 走的好像不是 curl 的方式,所以也没用。 通过...

whoru
11分钟前
0
0
TiDB EcoSystem Tools 原理解读系列(二)TiDB-Lightning Toolset 介绍

简介 TiDB-Lightning Toolset 是一套快速全量导入 SQL dump 文件到 TiDB 集群的工具集,自 2.1.0 版本起随 TiDB 发布,速度可达到传统执行 SQL 导入方式的至少 3 倍、大约每小时 100 GB,适合...

TiDB
13分钟前
0
0
【Visual Studio 扩展工具】如何在ComponentOneFlexGrid树中显示RadioButton

概述 在ComponentOne Enterprise .NET控件集中,FlexGrid表格控件是用户使用频率最高的控件之一。它是一个功能强大的数据管理工具,轻盈且灵动,以分层的形式展示数据(数据呈现更加直观)。...

葡萄城技术团队
15分钟前
0
0
Maven环境隔离

Maven环境隔离 1. 什么是Maven环境隔离 顾名思义,Maven环境隔离就是将开发中的环境与beat环境、生产环境分隔开,方便进行开发和维护。这个在实际项目中用的还是很多的,如果你的项目用的Mav...

蚂蚁-Declan
15分钟前
1
0
day182-2018-12-19-英语流利阅读-待学习

“性感”时代已去,维密将如何转身? Daniel 2018-12-19 1.今日导读 维多利亚的秘密(Victoria's Secret)这个内衣品牌,最近似乎步入了“中年危机”——曾经打遍天下的“性感”内衣,在主打...

飞鱼说编程
16分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部