Java 怎么使用给定的编写器(Writer)编写XML节点

2019年8月7日21:07:49Java 怎么使用给定的编写器(Writer)编写XML节点已关闭评论 507 2077字阅读6分55秒

1.简介

Java 怎么使用给定的编写器(Writer)编写XML节点?——请看下文。

2.示例代码

/**
 * 版权所有 编程十万个怎么办(www.tah1986.com)
 */


import java.io.IOException;

import java.io.Writer;

import org.w3c.dom.Attr;

import org.w3c.dom.DocumentType;

import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;

public class Main {
    
    public static void writeNode(Node n, Writer w) throws IOException {
        switch (n.getNodeType()) {
        case Node.ELEMENT_NODE:
            w.write("<");
            w.write(n.getNodeName());

            if (n.hasAttributes()) {
                NamedNodeMap attr = n.getAttributes();
                int len = attr.getLength();
                for (int i = 0; i < len; i++) {
                    Attr a = (Attr) attr.item(i);
                    w.write(" ");
                    w.write(a.getNodeName());
                    w.write("=\"");
                    w.write(contentToString(a.getNodeValue()));
                    w.write("\"");
                }
            }

            Node c = n.getFirstChild();
            if (c != null) {
                w.write(">");
                for (; c != null; c = c.getNextSibling()) {
                    writeNode(c, w);
                }
                w.write("</");
                w.write(n.getNodeName());
                w.write(">");
            } else {
                w.write("/>");
            }
            break;
        case Node.TEXT_NODE:
            w.write(contentToString(n.getNodeValue()));
            break;
        case Node.CDATA_SECTION_NODE:
            w.write("<![CDATA[");
            w.write(n.getNodeValue());
            w.write("]]>");
            break;
        case Node.ENTITY_REFERENCE_NODE:
            w.write("&");
            w.write(n.getNodeName());
            w.write(";");
            break;
        case Node.PROCESSING_INSTRUCTION_NODE:
            w.write("<?");
            w.write(n.getNodeName());
            
            w.write(" ");
            w.write(n.getNodeValue());
            w.write("?>");
            break;
        case Node.COMMENT_NODE:
            w.write("<!--");
            w.write(n.getNodeValue());
            w.write("-->");
            break;
        case Node.DOCUMENT_TYPE_NODE: {
            DocumentType dt = (DocumentType) n;
            w.write("<!DOCTYPE ");
            w.write(n.getOwnerDocument().getDocumentElement().getNodeName());
            String pubID = dt.getPublicId();
            if (pubID != null) {
                w.write(" PUBLIC \"" + dt.getNodeName() + "\" \"" + pubID
                        + "\">");
            } else {
                String sysID = dt.getSystemId();
                if (sysID != null)
                    w.write(" SYSTEM \"" + sysID + "\">");
            }
            break;
        }
        default:
            throw new IOException("Unknown DOM node type "
                    + n.getNodeType());
        }
    }

    
    public static String contentToString(String s) {
        if (s == null) {
            return "";
        }
        StringBuffer result = new StringBuffer(s.length());

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);

            switch (c) {
            case '<':
                result.append("<");
                break;
            case '>':
                result.append(">");
                break;
            case '&':
                result.append("&");
                break;
            case '"':
                result.append(""");
                break;
            case '\'':
                result.append("'");
                break;
            default:
                result.append(c);
            }
        }

        return result.toString();
    }
}

 
继续阅读
编程十万个怎么办