domattr.java
来自「kaffe Java 解释器语言,源码,Java的子集系统,开放源代码」· Java 代码 · 共 264 行
JAVA
264 行
/* * Copyright (C) 1999-2001 David Brownell * * This file is part of GNU JAXP, a library. * * GNU JAXP is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JAXP is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */package gnu.xml.dom;import org.w3c.dom.*;import org.w3c.dom.events.MutationEvent;/** * <p> "Attr" implementation. In DOM, attributes cost quite a lot of * memory because their values are complex structures rather than just * simple strings. To reduce your costs, avoid having more than one * child of an attribute; stick to a single Text node child, and ignore * even that by using the attribute's "nodeValue" property.</p> * * <p> As a bit of general advice, only look at attribute modification * events through the DOMAttrModified event (sent to the associated * element). Implementations are not guaranteed to report other events * in the same order, so you're very likely to write nonportable code if * you monitor events at the "children of Attr" level.</p> * * <p> At this writing, not all attribute modifications will cause the * DOMAttrModified event to be triggered ... only the ones using the string * methods (setNodeValue, setValue, and Element.setAttribute) to modify * those values. That is, if you manipulate those children directly, * elements won't get notified that attribute values have changed. * The natural fix for that will report other modifications, but won't * be able to expose "previous" attribute value; it'll need to be cached * or something (at which point why bother using child nodes). </p> * * <p><em>You are strongly advised not to use "children" of any attribute * nodes you work with.</em> </p> * * @author David Brownell */public class DomAttr extends DomNsNode implements Attr{ private boolean specified; // NOTE: it could be possible to rework this code a bit so that // this extra field isn't needed; "parent" might do double duty, // with appropriate safeguards. Using less space is healthy! private DomElement element; /** * Constructs an Attr node associated with the specified document. * The "specified" flag is initialized to true, since this DOM has * no current "back door" mechanisms to manage default values so * that every value must effectively be "specified". * * <p>This constructor should only be invoked by a Document as part of * its createAttribute functionality, or through a subclass which is * similarly used in a "Sub-DOM" style layer. * * @param owner The document with which this node is associated * @param namespaceURI Combined with the local part of the name, * this is used to uniquely identify a type of attribute * @param name Name of this attribute, which may include a prefix */ protected DomAttr (Document owner, String namespaceURI, String name) { super (owner, namespaceURI, name); specified = true; // XXX register self to get insertion/removal events // and character data change events and when they happen, // report self-mutation } /** * <b>DOM L1</b> * Returns the attribute name (same as getNodeName) */ final public String getName () { return getNodeName (); } /** * <b>DOM L1</b> * Returns the constant ATTRIBUTE_NODE. */ final public short getNodeType () { return ATTRIBUTE_NODE; } /** * <b>DOM L1</b> * Returns true if a parser reported this was in the source text. */ final public boolean getSpecified () { return specified; } /** * Records whether this attribute was in the source text. */ final public void setSpecified (boolean value) { specified = value; } /** * <b>DOM L1</b> * Returns the attribute value, with character and entity * references substituted. * <em>NOTE: entity refs as children aren't currently handled.</em> */ public String getNodeValue () { int length = getLength (); String retval = null; for (int i = 0; i < length; i++) { Node n = item (i); if (n.getNodeType () == TEXT_NODE) { if (retval == null) retval = n.getNodeValue (); else retval += n.getNodeValue (); continue; } // XXX entity ref child of attribute // contents exclude comments, PIs, elements throw new DomEx (DomEx.NOT_SUPPORTED_ERR); } if (retval == null) retval = ""; return retval; } /** * <b>DOM L1</b> * Assigns the value of the attribute; it will have one child, * which is a text node with the specified value (same as * setNodeValue). */ final public void setValue (String value) { setNodeValue (value); } /** * <b>DOM L1</b> * Returns the value of the attribute as a non-null string; same * as getNodeValue. * <em>NOTE: entity refs as children aren't currently handled.</em> */ final public String getValue () { return getNodeValue (); } /** * <b>DOM L1</b> * Assigns the attribute value; using this API, no entity or * character references will exist. * Causes a DOMAttrModified mutation event to be sent. */ public void setNodeValue (String value) { int len = getLength (); String oldValue; if (isReadonly ()) throw new DomEx (DomEx.NO_MODIFICATION_ALLOWED_ERR); oldValue = getValue (); for (int i = 0; i < len; i++) removeChild (getLastChild ()); appendChild (getOwnerDocument ().createTextNode (value)); specified = true; mutating (oldValue, value, MutationEvent.MODIFICATION); } /** * <b>DOM L2</b> * Returns the element with which this attribute is associated. */ final public Element getOwnerElement () { return element; } /** * Records the element with which this attribute is associated. */ final public void setOwnerElement (Element e) { if (element != null) throw new DomEx (DomEx.HIERARCHY_REQUEST_ERR); if (!(e instanceof DomElement)) throw new DomEx (DomEx.WRONG_DOCUMENT_ERR); element = (DomElement) e; } /** * Shallow clone of the attribute, breaking all ties with any * elements. */ public Object clone () { DomAttr retval = (DomAttr) super.clone (); retval.element = null; retval.specified = false; return retval; } private void mutating (String oldValue, String newValue, short why) { if (!reportMutations || element == null) return; // EVENT: DOMAttrModified, target = element, // prev/new values provided, also attr name MutationEvent event; event = (MutationEvent) createEvent ("MutationEvents"); event.initMutationEvent ("DOMAttrModified", true /* bubbles */, false /* nocancel */, null, oldValue, newValue, getNodeName (), why); element.dispatchEvent (event); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?