📄 xmlelement.java
字号:
/* ==================================================================== * * Skin Look And Feel 6.7 License. * * Copyright (c) 2000-2006 L2FProd.com. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by L2FProd.com * (http://www.L2FProd.com/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "Skin Look And Feel", "SkinLF" and "L2FProd.com" must not * be used to endorse or promote products derived from this software * without prior written permission. For written permission, please * contact info@L2FProd.com. * * 5. Products derived from this software may not be called "SkinLF" * nor may "SkinLF" appear in their names without prior written * permission of L2FProd.com. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL L2FPROD.COM OR ITS CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== */package com.l2fprod.contrib.nanoxml;import java.io.IOException;import java.io.Reader;import java.io.Writer;import java.io.PrintWriter;import java.io.Serializable;import java.io.StringWriter;import java.util.Enumeration;import java.util.Hashtable;import java.util.Properties;import java.util.Vector;/** * XMLElement is a representation of an XML object. The object is able to parse * XML code. <P> * * Note that NanoXML is not 100% XML 1.0 compliant: * <UL> * <LI> The parser is non-validating. * <LI> The DTD is fully ignored, including <CODE><!ENTITY...></CODE>. * * <LI> There is no support for mixed content (elements containing both * subelements and CDATA elements) * </UL> * <P> * * You can opt to use a SAX compatible API, by including both <CODE>nanoxml.jar</CODE> * and <CODE>nanoxml-sax.jar</CODE> in your classpath and setting the property * <CODE>org.xml.sax.parser</CODE> to <CODE>nanoxml.sax.SAXParser</CODE> <P> * * $Revision: 1.3 $<BR> * $Date: 2005/11/19 09:15:30 $<P> * * * * @author Marc De Scheemaecker <<A * HREF="mailto:Marc.DeScheemaecker@advalvas.be" > * Marc.DeScheemaecker@advalvas.be</A> > * @created 27 avril 2002 * @see com.l2fprod.contrib.nanoxml.XMLParseException * @version 1.6 */public class XMLElement implements Serializable { /** * The attributes given to the object. */ private Properties attributes; /** * Subobjects of the object. The subobjects are of class XMLElement * themselves. */ private Vector children; /** * The class of the object (the name indicated in the tag). */ private String tagName; /** * The #PCDATA content of the object. If there is no such content, this field * is null. */ private String contents; /** * Conversion table for &...; tags. */ private Properties conversionTable; /** * Whether to skip leading whitespace in CDATA. */ private boolean skipLeadingWhitespace; /** * The line number where the element starts. */ private int lineNr; /** * Whether the parsing is case sensitive. */ private boolean ignoreCase; /** * Major version of NanoXML. */ public final static int NANOXML_MAJOR_VERSION = 1; /** * Minor version of NanoXML. */ public final static int NANOXML_MINOR_VERSION = 6; /** * Serialization serial version ID. */ final static long serialVersionUID = 6685035139346394777L; /** * Creates a new XML element. The following settings are used: * <DL> * <DT> Conversion table</DT> * <DD> Minimal XML conversions: <CODE>&amp; &lt; &gt; * &apos; &quot;</CODE></DD> * <DT> Skip whitespace in contents</DT> * <DD> <CODE>false</CODE></DD> * <DT> Ignore Case</DT> * <DD> <CODE>true</CODE></DD> * </DL> * * * @see com.l2fprod.contrib.nanoxml.XMLElement#XMLElement(java.util.Properties) * @see com.l2fprod.contrib.nanoxml.XMLElement#XMLElement(boolean) * @see com.l2fprod.contrib.nanoxml.XMLElement#XMLElement(java.util.Properties,boolean) */ public XMLElement() { this(new Properties(), false, true, true); } /** * Creates a new XML element. The following settings are used: * <DL> * <DT> Conversion table</DT> * <DD> <I>conversionTable</I> combined with the minimal XML conversions: * <CODE>&amp; &lt; &gt; * &apos; &quot;</CODE></DD> * <DT> Skip whitespace in contents</DT> * <DD> <CODE>false</CODE></DD> * <DT> Ignore Case</DT> * <DD> <CODE>true</CODE></DD> * </DL> * * * @param conversionTable Description of Parameter * @see com.l2fprod.contrib.nanoxml.XMLElement#XMLElement() * @see com.l2fprod.contrib.nanoxml.XMLElement#XMLElement(boolean) * @see com.l2fprod.contrib.nanoxml.XMLElement#XMLElement(java.util.Properties,boolean) */ public XMLElement(Properties conversionTable) { this(conversionTable, false, true, true); } /** * Creates a new XML element. The following settings are used: * <DL> * <DT> Conversion table</DT> * <DD> Minimal XML conversions: <CODE>&amp; &lt; &gt; * &apos; &quot;</CODE></DD> * <DT> Skip whitespace in contents</DT> * <DD> <I>skipLeadingWhitespace</I> </DD> * <DT> Ignore Case</DT> * <DD> <CODE>true</CODE></DD> * </DL> * * * @param skipLeadingWhitespace Description of Parameter * @see com.l2fprod.contrib.nanoxml.XMLElement#XMLElement() * @see com.l2fprod.contrib.nanoxml.XMLElement#XMLElement(java.util.Properties) * @see com.l2fprod.contrib.nanoxml.XMLElement#XMLElement(java.util.Properties,boolean) */ public XMLElement(boolean skipLeadingWhitespace) { this(new Properties(), skipLeadingWhitespace, true, true); } /** * Creates a new XML element. The following settings are used: * <DL> * <DT> Conversion table</DT> * <DD> <I>conversionTable</I> combined with the minimal XML conversions: * <CODE>&amp; &lt; &gt; * &apos; &quot;</CODE></DD> * <DT> Skip whitespace in contents</DT> * <DD> <I>skipLeadingWhitespace</I> </DD> * <DT> Ignore Case</DT> * <DD> <CODE>true</CODE></DD> * </DL> * * * @param conversionTable Description of Parameter * @param skipLeadingWhitespace Description of Parameter * @see com.l2fprod.contrib.nanoxml.XMLElement#XMLElement() * @see com.l2fprod.contrib.nanoxml.XMLElement#XMLElement(boolean) * @see com.l2fprod.contrib.nanoxml.XMLElement#XMLElement(java.util.Properties) */ public XMLElement(Properties conversionTable, boolean skipLeadingWhitespace) { this(conversionTable, skipLeadingWhitespace, true, true); } /** * Creates a new XML element. The following settings are used: * <DL> * <DT> Conversion table</DT> * <DD> <I>conversionTable</I> , eventually combined with the minimal XML * conversions: <CODE>&amp; &lt; &gt; * &apos; &quot;</CODE> (depending on <I> * fillBasicConversionTable</I> )</DD> * <DT> Skip whitespace in contents</DT> * <DD> <I>skipLeadingWhitespace</I> </DD> * <DT> Ignore Case</DT> * <DD> <I>ignoreCase</I> </DD> * </DL> * <P> * * This constructor should <I>only</I> be called from XMLElement itself to * create child elements. * * @param conversionTable Description of Parameter * @param skipLeadingWhitespace Description of Parameter * @param ignoreCase Description of Parameter * @see com.l2fprod.contrib.nanoxml.XMLElement#XMLElement() * @see com.l2fprod.contrib.nanoxml.XMLElement#XMLElement(boolean) * @see com.l2fprod.contrib.nanoxml.XMLElement#XMLElement(java.util.Properties) * @see com.l2fprod.contrib.nanoxml.XMLElement#XMLElement(java.util.Properties,boolean) */ public XMLElement(Properties conversionTable, boolean skipLeadingWhitespace, boolean ignoreCase) { this(conversionTable, skipLeadingWhitespace, true, ignoreCase); } /** * Creates a new XML element. The following settings are used: * <DL> * <DT> Conversion table</DT> * <DD> <I>conversionTable</I> , eventually combined with the minimal XML * conversions: <CODE>&amp; &lt; &gt; * &apos; &quot;</CODE> (depending on <I> * fillBasicConversionTable</I> )</DD> * <DT> Skip whitespace in contents</DT> * <DD> <I>skipLeadingWhitespace</I> </DD> * <DT> Ignore Case</DT> * <DD> <I>ignoreCase</I> </DD> * </DL> * <P> * * This constructor should <I>only</I> be called from XMLElement itself to * create child elements. * * @param conversionTable Description of Parameter * @param skipLeadingWhitespace Description of Parameter * @param fillBasicConversionTable Description of Parameter * @param ignoreCase Description of Parameter * @see com.l2fprod.contrib.nanoxml.XMLElement#XMLElement() * @see com.l2fprod.contrib.nanoxml.XMLElement#XMLElement(boolean) * @see com.l2fprod.contrib.nanoxml.XMLElement#XMLElement(java.util.Properties) * @see com.l2fprod.contrib.nanoxml.XMLElement#XMLElement(java.util.Properties,boolean) */ protected XMLElement(Properties conversionTable, boolean skipLeadingWhitespace, boolean fillBasicConversionTable, boolean ignoreCase) { this.ignoreCase = ignoreCase; this.skipLeadingWhitespace = skipLeadingWhitespace; this.tagName = null; this.contents = ""; this.attributes = new Properties(); this.children = new Vector(); this.conversionTable = conversionTable; this.lineNr = 0; if (fillBasicConversionTable) { this.conversionTable.put("lt", "<"); this.conversionTable.put("gt", ">"); this.conversionTable.put("quot", "\""); this.conversionTable.put("apos", "'"); this.conversionTable.put("amp", "&"); } } /** * Changes the content string. * * @param content The new content string. */ public void setContent(String content) { this.contents = content; } /** * Changes the tag name. * * @param tagName The new tag name. */ public void setTagName(String tagName) { this.tagName = tagName; } /** * Returns the subobjects of the object. * * @return The Children value */ public Vector getChildren() { return this.children; } /** * Returns the #PCDATA content of the object. If there is no such content, * <CODE>null</CODE> is returned. * * @return The Contents value */ public String getContents() { return this.contents; } /** * Returns the line nr on which the element is found. * * @return The LineNr value */ public int getLineNr() { return this.lineNr; } /** * Returns a property by looking up a key in a hashtable. If the property * doesn't exist, the value corresponding to defaultValue is returned. * * @param key Description of Parameter * @param valueSet Description of Parameter * @param defaultValue Description of Parameter * @return The IntProperty value */ public int getIntProperty(String key, Hashtable valueSet, String defaultValue) { String val = this.attributes.getProperty(key); Integer result; if (this.ignoreCase) { key = key.toUpperCase(); } if (val == null) { val = defaultValue; } try { result = (Integer) (valueSet.get(val)); } catch (ClassCastException e) { throw this.invalidValueSet(key); } if (result == null) { throw this.invalidValue(key, val, this.lineNr); } return result.intValue(); } /** * Returns a property of the object. If there is no such property, this method * returns <CODE>null</CODE>. * * @param key Description of Parameter * @return The Property value */ public String getProperty(String key) { if (this.ignoreCase) { key = key.toUpperCase(); } return this.attributes.getProperty(key); } /** * Returns a property of the object. If the property doesn't exist, <I> * defaultValue</I> is returned. * * @param key Description of Parameter * @param defaultValue Description of Parameter * @return The Property value */ public String getProperty(String key, String defaultValue) { if (this.ignoreCase) { key = key.toUpperCase(); } return this.attributes.getProperty(key, defaultValue); } /** * Returns an integer property of the object. If the property doesn't exist, * <I>defaultValue</I> is returned. * * @param key Description of Parameter * @param defaultValue Description of Parameter * @return The Property value */ public int getProperty(String key, int defaultValue) { if (this.ignoreCase) { key = key.toUpperCase(); } String val = this.attributes.getProperty(key); if (val == null) { return defaultValue; } else { try { return Integer.parseInt(val); } catch (NumberFormatException e) { throw this.invalidValue(key, val, this.lineNr); } } } /** * Returns a floating point property of the object. If the property doesn't * exist, <I>defaultValue</I> is returned. * * @param key Description of Parameter * @param defaultValue Description of Parameter * @return The Property value
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -