⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlprocessor.java

📁 這是一個javascript 的 interpreter是了解 web browser的好材料
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
    }    final Node toXml(String defaultNamespaceUri, String xml) throws org.xml.sax.SAXException {        //    See ECMA357 10.3.1        DocumentBuilder builder = null;        try {            String syntheticXml = "<parent xmlns=\"" + defaultNamespaceUri +                "\">" + xml + "</parent>";            builder = getDocumentBuilderFromPool();             Document document = builder.parse( new org.xml.sax.InputSource(new java.io.StringReader(syntheticXml)) );            if (ignoreProcessingInstructions) {                java.util.Vector v = new java.util.Vector();                addProcessingInstructionsTo(v, document);                for (int i=0; i<v.size(); i++) {                    Node node = (Node)v.elementAt(i);                    node.getParentNode().removeChild(node);                }            }            if (ignoreComments) {                java.util.Vector v = new java.util.Vector();                addCommentsTo(v, document);                for (int i=0; i<v.size(); i++) {                    Node node = (Node)v.elementAt(i);                    node.getParentNode().removeChild(node);                }            }            if (ignoreWhitespace) {                //    Apparently JAXP setIgnoringElementContentWhitespace() has a different meaning, it appears from the Javadoc                //    Refers to element-only content models, which means we would need to have a validating parser and DTD or schema                //    so that it would know which whitespace to ignore.                //    Instead we will try to delete it ourselves.                java.util.Vector v = new java.util.Vector();                addTextNodesToRemoveAndTrim(v, document);                for (int i=0; i<v.size(); i++) {                    Node node = (Node)v.elementAt(i);                    node.getParentNode().removeChild(node);                }            }            NodeList rv = document.getDocumentElement().getChildNodes();            if (rv.getLength() > 1) {                throw ScriptRuntime.constructError("SyntaxError", "XML objects may contain at most one node.");            } else if (rv.getLength() == 0) {                Node node = document.createTextNode("");                return node;            } else {                Node node = rv.item(0);                document.getDocumentElement().removeChild(node);                return node;            }        } catch (java.io.IOException e) {            throw new RuntimeException("Unreachable.");        } catch (javax.xml.parsers.ParserConfigurationException e) {            throw new RuntimeException(e);        } finally {            if (builder != null)                returnDocumentBuilderToPool(builder);        }    }    Document newDocument() {        DocumentBuilder builder = null;        try {            //    TODO    Should this use XML settings?            builder = getDocumentBuilderFromPool();            return builder.newDocument();        } catch (javax.xml.parsers.ParserConfigurationException ex) {            //    TODO    How to handle these runtime errors?            throw new RuntimeException(ex);        } finally {            if (builder != null)                returnDocumentBuilderToPool(builder);        }    }    //    TODO    Cannot remember what this is for, so whether it should use settings or not    private String toString(Node node) {        javax.xml.transform.dom.DOMSource source = new javax.xml.transform.dom.DOMSource(node);        java.io.StringWriter writer = new java.io.StringWriter();        javax.xml.transform.stream.StreamResult result = new javax.xml.transform.stream.StreamResult(writer);        try {            javax.xml.transform.Transformer transformer = xform.newTransformer();            transformer.setOutputProperty(javax.xml.transform.OutputKeys.OMIT_XML_DECLARATION, "yes");            transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT, "no");            transformer.setOutputProperty(javax.xml.transform.OutputKeys.METHOD, "xml");            transformer.transform(source, result);        } catch (javax.xml.transform.TransformerConfigurationException ex) {            //    TODO    How to handle these runtime errors?            throw new RuntimeException(ex);        } catch (javax.xml.transform.TransformerException ex) {            //    TODO    How to handle these runtime errors?            throw new RuntimeException(ex);        }        return toXmlNewlines(writer.toString());    }    String escapeAttributeValue(Object value) {        String text = ScriptRuntime.toString(value);        if (text.length() == 0) return "";        Document dom = newDocument();        Element e = dom.createElement("a");        e.setAttribute("b", text);        String elementText = toString(e);        int begin = elementText.indexOf('"');        int end = elementText.lastIndexOf('"');        return elementText.substring(begin+1,end);    }    String escapeTextValue(Object value) {        if (value instanceof XMLObjectImpl) {            return ((XMLObjectImpl)value).toXMLString();        }        String text = ScriptRuntime.toString(value);        if (text.length() == 0) return text;        Document dom = newDocument();        Element e = dom.createElement("a");        e.setTextContent(text);        String elementText = toString(e);        int begin = elementText.indexOf('>') + 1;        int end = elementText.lastIndexOf('<');        return (begin < end) ? elementText.substring(begin, end) : "";    }    private String escapeElementValue(String s) {        //    TODO    Check this        return escapeTextValue(s);    }    private String elementToXmlString(Element element) {        //    TODO    My goodness ECMA is complicated (see 10.2.1).  We'll try this first.        Element copy = (Element)element.cloneNode(true);        if (prettyPrint) {            beautifyElement(copy, 0);        }        return toString(copy);    }    final String ecmaToXmlString(Node node) {        //    See ECMA 357 Section 10.2.1        StringBuffer s = new StringBuffer();        int indentLevel = 0;        if (prettyPrint) {            for (int i=0; i<indentLevel; i++) {                s.append(' ');            }        }        if (node instanceof Text) {            String data = ((Text)node).getData();            //    TODO Does Java trim() work same as XMLWhitespace?            String v = (prettyPrint) ? data.trim() : data;            s.append(escapeElementValue(v));            return s.toString();        }        if (node instanceof Attr) {            String value = ((Attr)node).getValue();            s.append(escapeAttributeValue(value));            return s.toString();        }        if (node instanceof Comment) {            s.append("<!--" + ((Comment)node).getNodeValue() + "-->");            return s.toString();        }        if (node instanceof ProcessingInstruction) {            ProcessingInstruction pi = (ProcessingInstruction)node;            s.append("<?" + pi.getTarget() + " " + pi.getData() + "?>");            return s.toString();        }        s.append(elementToXmlString((Element)node));        return s.toString();    }    private void beautifyElement(Element e, int indent) {        StringBuffer s = new StringBuffer();        s.append('\n');        for (int i=0; i<indent; i++) {            s.append(' ');        }        String afterContent = s.toString();        for (int i=0; i<prettyIndent; i++) {            s.append(' ');        }        String beforeContent = s.toString();        //    We "mark" all the nodes first; if we tried to do this loop otherwise, it would behave unexpectedly (the inserted nodes        //    would contribute to the length and it might never terminate).        java.util.Vector toIndent = new java.util.Vector();        boolean indentChildren = false;        for (int i=0; i<e.getChildNodes().getLength(); i++) {            if (i == 1) indentChildren = true;            if (e.getChildNodes().item(i) instanceof Text) {                toIndent.add(e.getChildNodes().item(i));            } else {                indentChildren = true;                toIndent.add(e.getChildNodes().item(i));            }        }        if (indentChildren) {            for (int i=0; i<toIndent.size(); i++) {                e.insertBefore( e.getOwnerDocument().createTextNode(beforeContent), (Node)toIndent.elementAt(i) );            }        }        NodeList nodes = e.getChildNodes();        java.util.Vector v = new java.util.Vector();        for (int i=0; i<nodes.getLength(); i++) {            if (nodes.item(i) instanceof Element) {                v.add( nodes.item(i) );            }        }        for (int i=0; i<v.size(); i++) {            beautifyElement( (Element)v.elementAt(i), indent + prettyIndent );        }        if (indentChildren) {            e.appendChild( e.getOwnerDocument().createTextNode(afterContent) );        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -