elementimpl.java

来自「JAVA 所有包」· Java 代码 · 共 1,163 行 · 第 1/3 页

JAVA
1,163
字号
/* * Copyright 1999-2002,2004 The Apache Software Foundation. *  * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at *  *      http://www.apache.org/licenses/LICENSE-2.0 *  * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.sun.org.apache.xerces.internal.dom;import org.w3c.dom.Attr;import org.w3c.dom.DOMException;import org.w3c.dom.Element;import org.w3c.dom.NamedNodeMap;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.w3c.dom.Text;import org.w3c.dom.TypeInfo;import com.sun.org.apache.xerces.internal.util.URI;/** * Elements represent most of the "markup" and structure of the * document.  They contain both the data for the element itself * (element name and attributes), and any contained nodes, including * document text (as children). * <P> * Elements may have Attributes associated with them; the API for this is * defined in Node, but the function is implemented here. In general, XML * applications should retrive Attributes as Nodes, since they may contain * entity references and hence be a fairly complex sub-tree. HTML users will * be dealing with simple string values, and convenience methods are provided * to work in terms of Strings. * <P> * ElementImpl does not support Namespaces. ElementNSImpl, which inherits from * it, does. * @see ElementNSImpl *  * @xerces.internal * * @author Arnaud  Le Hors, IBM * @author Joe Kesselman, IBM * @author Andy Clark, IBM * @author Ralf Pfeiffer, IBM * @version $Id: ElementImpl.java,v 1.3 2005/09/02 05:52:22 neerajbj Exp $ * @since  PR-DOM-Level-1-19980818. */public class ElementImpl    extends ParentNode    implements Element, TypeInfo {    //    // Constants    //    /** Serialization version. */    static final long serialVersionUID = 3717253516652722278L;    //    // Data    //    /** Element name. */    protected String name;    /** Attributes. */    protected AttributeMap attributes;    //    // Constructors    //    /** Factory constructor. */    public ElementImpl(CoreDocumentImpl ownerDoc, String name) {    	super(ownerDoc);        this.name = name;        needsSyncData(true);    // synchronizeData will initialize attributes    }    // for ElementNSImpl    protected ElementImpl() {}    // Support for DOM Level 3 renameNode method.    // Note: This only deals with part of the pb. CoreDocumentImpl    // does all the work.    void rename(String name) {        if (needsSyncData()) {            synchronizeData();        }	    this.name = name;        reconcileDefaultAttributes();    }    //    // Node methods    //    /**     * A short integer indicating what type of node this is. The named     * constants for this value are defined in the org.w3c.dom.Node interface.     */    public short getNodeType() {        return Node.ELEMENT_NODE;    }    /**     * Returns the element name     */    public String getNodeName() {        if (needsSyncData()) {            synchronizeData();        }        return name;    }    /**     * Retrieve all the Attributes as a set. Note that this API is inherited     * from Node rather than specified on Element; in fact only Elements will     * ever have Attributes, but they want to allow folks to "blindly" operate     * on the tree as a set of Nodes.     */    public NamedNodeMap getAttributes() {        if (needsSyncData()) {            synchronizeData();        }        if (attributes == null) {            attributes = new AttributeMap(this, null);        }        return attributes;    } // getAttributes():NamedNodeMap    /**     * Return a duplicate copy of this Element. Note that its children     * will not be copied unless the "deep" flag is true, but Attributes     * are <i>always</i> replicated.     *     * @see org.w3c.dom.Node#cloneNode(boolean)     */    public Node cloneNode(boolean deep) {    	ElementImpl newnode = (ElementImpl) super.cloneNode(deep);    	// Replicate NamedNodeMap rather than sharing it.        if (attributes != null) {            newnode.attributes = (AttributeMap) attributes.cloneMap(newnode);        }    	return newnode;    } // cloneNode(boolean):Node   /**     * DOM Level 3 WD - Experimental.     * Retrieve baseURI     */    public String getBaseURI() {        if (needsSyncData()) {            synchronizeData();        }        // Absolute base URI is computed according to         // XML Base (http://www.w3.org/TR/xmlbase/#granularity)        // 1. The base URI specified by an xml:base attribute on the element,         // if one exists        if (attributes != null) {            Attr attrNode = (Attr)attributes.getNamedItem("xml:base");            if (attrNode != null) {                String uri =  attrNode.getNodeValue();                if (uri.length() != 0 ) {// attribute value is always empty string                    try {                       uri = new URI(uri).toString();                    }                    catch (com.sun.org.apache.xerces.internal.util.URI.MalformedURIException e) {                        // This may be a relative URI.                                                // Make any parentURI into a URI object to use with the URI(URI, String) constructor                        String parentBaseURI = (this.ownerNode != null) ? this.ownerNode.getBaseURI() : null;                        if (parentBaseURI != null){                            try{                                uri = new URI(new URI(parentBaseURI), uri).toString();                            }                            catch (com.sun.org.apache.xerces.internal.util.URI.MalformedURIException ex){                                // This should never happen: parent should have checked the URI and returned null if invalid.                                return null;                            }                            return uri;                        }                        return null;                    }                    return uri;                }            }        }        // 2.the base URI of the element's parent element within the         // document or external entity, if one exists 		// 3. the base URI of the document entity or external entity 		// containing the element				// ownerNode serves as a parent or as document		String baseURI = (this.ownerNode != null) ? this.ownerNode.getBaseURI() : null ;        //base URI of parent element is not null        if(baseURI != null){            try {                //return valid absolute base URI               return new URI(baseURI).toString();            }            catch (com.sun.org.apache.xerces.internal.util.URI.MalformedURIException e){                return null;            }        }        return null;    } //getBaseURI    /**     * NON-DOM     * set the ownerDocument of this node, its children, and its attributes     */    void setOwnerDocument(CoreDocumentImpl doc) {	super.setOwnerDocument(doc);        if (attributes != null) {            attributes.setOwnerDocument(doc);        }    }    //    // Element methods    //    /**     * Look up a single Attribute by name. Returns the Attribute's     * string value, or an empty string (NOT null!) to indicate that the     * name did not map to a currently defined attribute.     * <p>     * Note: Attributes may contain complex node trees. This method     * returns the "flattened" string obtained from Attribute.getValue().     * If you need the structure information, see getAttributeNode().     */    public String getAttribute(String name) {        if (needsSyncData()) {            synchronizeData();        }        if (attributes == null) {            return "";        }        Attr attr = (Attr)(attributes.getNamedItem(name));        return (attr == null) ? "" : attr.getValue();    } // getAttribute(String):String    /**     * Look up a single Attribute by name. Returns the Attribute Node,     * so its complete child tree is available. This could be important in     * XML, where the string rendering may not be sufficient information.     * <p>     * If no matching attribute is available, returns null.     */    public Attr getAttributeNode(String name) {        if (needsSyncData()) {            synchronizeData();        }        if (attributes == null) {            return null;        }        return (Attr)attributes.getNamedItem(name);    } // getAttributeNode(String):Attr    /**     * Returns a NodeList of all descendent nodes (children,     * grandchildren, and so on) which are Elements and which have the     * specified tag name.     * <p>     * Note: NodeList is a "live" view of the DOM. Its contents will     * change as the DOM changes, and alterations made to the NodeList     * will be reflected in the DOM.     *     * @param tagname The type of element to gather. To obtain a list of     * all elements no matter what their names, use the wild-card tag     * name "*".     *     * @see DeepNodeListImpl     */    public NodeList getElementsByTagName(String tagname) {    	return new DeepNodeListImpl(this,tagname);    }    /**     * Returns the name of the Element. Note that Element.nodeName() is     * defined to also return the tag name.     * <p>     * This is case-preserving in XML. HTML should uppercasify it on the     * way in.     */    public String getTagName() {        if (needsSyncData()) {            synchronizeData();        }    	return name;    }    /**     * In "normal form" (as read from a source file), there will never be two     * Text children in succession. But DOM users may create successive Text     * nodes in the course of manipulating the document. Normalize walks the     * sub-tree and merges adjacent Texts, as if the DOM had been written out     * and read back in again. This simplifies implementation of higher-level     * functions that may want to assume that the document is in standard form.     * <p>     * To normalize a Document, normalize its top-level Element child.     * <p>     * As of PR-DOM-Level-1-19980818, CDATA -- despite being a subclass of     * Text -- is considered "markup" and will _not_ be merged either with     * normal Text or with other CDATASections.     */    public void normalize() {        // No need to normalize if already normalized.        if (isNormalized()) {            return;        }        if (needsSyncChildren()) {            synchronizeChildren();        }        ChildNode kid, next;        for (kid = firstChild; kid != null; kid = next) {            next = kid.nextSibling;            // If kid is a text node, we need to check for one of two            // conditions:            //   1) There is an adjacent text node            //   2) There is no adjacent text node, but kid is            //      an empty text node.            if ( kid.getNodeType() == Node.TEXT_NODE )            {                // If an adjacent text node, merge it with kid                if ( next!=null && next.getNodeType() == Node.TEXT_NODE )                {                    ((Text)kid).appendData(next.getNodeValue());                    removeChild( next );                    next = kid; // Don't advance; there might be another.                }                else                {                    // If kid is empty, remove it                    if ( kid.getNodeValue() == null || kid.getNodeValue().length() == 0 ) {                        removeChild( kid );                    }                }            }            // Otherwise it might be an Element, which is handled recursively            else if (kid.getNodeType() == Node.ELEMENT_NODE) {                kid.normalize();            }        }        // We must also normalize all of the attributes        if ( attributes!=null )        {            for( int i=0; i<attributes.getLength(); ++i )            {                Node attr = attributes.item(i);                attr.normalize();            }        }    	// changed() will have occurred when the removeChild() was done,    	// so does not have to be reissued.        isNormalized(true);    } // normalize()    /**     * Remove the named attribute from this Element. If the removed

⌨️ 快捷键说明

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