1997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu/* Copyright (c) 2002,2003, Stefan Haustein, Oberhausen, Rhld., Germany 2997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * 3997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Permission is hereby granted, free of charge, to any person obtaining a copy 4997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * of this software and associated documentation files (the "Software"), to deal 5997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * in the Software without restriction, including without limitation the rights 6997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * to use, copy, modify, merge, publish, distribute, sublicense, and/or 7997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * sell copies of the Software, and to permit persons to whom the Software is 8997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * furnished to do so, subject to the following conditions: 9997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * 10997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * The above copyright notice and this permission notice shall be included in 11997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * all copies or substantial portions of the Software. 12997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * 13997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 18997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 19997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * IN THE SOFTWARE. */ 20997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 21997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yupackage org.ksoap2.kdom; 22997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 23997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.io.*; 24997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.util.*; 25997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 26997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport org.xmlpull.v1.*; 27997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 28997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu/** 29997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * In order to create an element, please use the createElement method 30997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * instead of invoking the constructor directly. The right place to 31997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * add user defined initialization code is the init method. */ 32997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 33997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yupublic class Element extends Node { 34997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 35997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu protected String namespace; 36997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu protected String name; 37997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu protected Vector attributes; 38997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu protected Node parent; 39997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu protected Vector prefixes; 40997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 41997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public Element() { 42997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 43997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 44997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** 45997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * called when all properties are set, but before children 46997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * are parsed. Please do not use setParent for initialization 47997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * code any longer. */ 48997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 49997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public void init() { 50997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 51997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 52997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** 53997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * removes all children and attributes */ 54997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 55997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public void clear() { 56997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu attributes = null; 57997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu children = null; 58997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 59997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 60997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** 61997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Forwards creation request to parent if any, otherwise 62997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * calls super.createElement. */ 63997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 64997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public Element createElement( 65997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu String namespace, 66997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu String name) { 67997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 68997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return (this.parent == null) 69997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu ? super.createElement(namespace, name) 70997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu : this.parent.createElement(namespace, name); 71997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 72997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 73997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** 74997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Returns the number of attributes of this element. */ 75997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 76997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public int getAttributeCount() { 77997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return attributes == null ? 0 : attributes.size(); 78997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 79997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 80997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public String getAttributeNamespace(int index) { 81997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return ((String[]) attributes.elementAt(index))[0]; 82997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 83997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 84997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /* public String getAttributePrefix (int index) { 85997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return ((String []) attributes.elementAt (index)) [1]; 86997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu }*/ 87997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 88997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public String getAttributeName(int index) { 89997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return ((String[]) attributes.elementAt(index))[1]; 90997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 91997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 92997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public String getAttributeValue(int index) { 93997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return ((String[]) attributes.elementAt(index))[2]; 94997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 95997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 96997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public String getAttributeValue(String namespace, String name) { 97997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu for (int i = 0; i < getAttributeCount(); i++) { 98997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (name.equals(getAttributeName(i)) 99997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu && (namespace == null || namespace.equals(getAttributeNamespace(i)))) { 100997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return getAttributeValue(i); 101997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 102997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 103997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return null; 104997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 105997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 106997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** 107997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Returns the root node, determined by ascending to the 108997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * all parents un of the root element. */ 109997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 110997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public Node getRoot() { 111997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 112997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu Element current = this; 113997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 114997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu while (current.parent != null) { 115997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (!(current.parent instanceof Element)) 116997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return current.parent; 117997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu current = (Element) current.parent; 118997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 119997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 120997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return current; 121997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 122997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 123997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** 124997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * returns the (local) name of the element */ 125997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 126997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public String getName() { 127997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return name; 128997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 129997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 130997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** 131997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * returns the namespace of the element */ 132997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 133997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public String getNamespace() { 134997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return namespace; 135997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 136997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 137997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** 138997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * returns the namespace for the given prefix */ 139997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 140997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public String getNamespaceUri(String prefix) { 141997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu int cnt = getNamespaceCount(); 142997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu for (int i = 0; i < cnt; i++) { 143997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (prefix == getNamespacePrefix(i) || 144997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu (prefix != null && prefix.equals(getNamespacePrefix(i)))) 145997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return getNamespaceUri(i); 146997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 147997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return parent instanceof Element ? ((Element) parent).getNamespaceUri(prefix) : null; 148997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 149997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 150997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** 151997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * returns the number of declared namespaces, NOT including 152997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * parent elements */ 153997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 154997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public int getNamespaceCount() { 155997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return (prefixes == null ? 0 : prefixes.size()); 156997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 157997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 158997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public String getNamespacePrefix(int i) { 159997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return ((String[]) prefixes.elementAt(i))[0]; 160997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 161997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 162997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public String getNamespaceUri(int i) { 163997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return ((String[]) prefixes.elementAt(i))[1]; 164997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 165997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 166997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** 167997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Returns the parent node of this element */ 168997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 169997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public Node getParent() { 170997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return parent; 171997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 172997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 173997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /* 174997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Returns the parent element if available, null otherwise 175997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 176997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public Element getParentElement() { 177997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return (parent instanceof Element) 178997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu ? ((Element) parent) 179997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu : null; 180997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 181997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu */ 182997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 183997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** 184997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Builds the child elements from the given Parser. By overwriting 185997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * parse, an element can take complete control over parsing its 186997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * subtree. */ 187997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 188997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public void parse(XmlPullParser parser) 189997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu throws IOException, XmlPullParserException { 190997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 191997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu for (int i = parser.getNamespaceCount(parser.getDepth() - 1); i < parser 192997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu .getNamespaceCount(parser.getDepth()); i++) { 193997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu setPrefix(parser.getNamespacePrefix(i), parser.getNamespaceUri(i)); 194997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 195997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 196997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu for (int i = 0; i < parser.getAttributeCount(); i++) 197997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu setAttribute(parser.getAttributeNamespace(i), 198997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // parser.getAttributePrefix (i), 199997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu parser.getAttributeName(i), 200997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu parser.getAttributeValue(i)); 201997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 202997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // if (prefixMap == null) throw new RuntimeException ("!!"); 203997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 204997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu init(); 205997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 206997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (parser.isEmptyElementTag()) 207997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu parser.nextToken(); 208997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu else { 209997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu parser.nextToken(); 210997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu super.parse(parser); 211997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 212997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (getChildCount() == 0) 213997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu addChild(IGNORABLE_WHITESPACE, ""); 214997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 215997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 216997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu parser.require( 217997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu XmlPullParser.END_TAG, 218997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu getNamespace(), 219997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu getName()); 220997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 221997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu parser.nextToken(); 222997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 223997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 224997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** 225997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Sets the given attribute; a value of null removes the attribute */ 226997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 227997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public void setAttribute(String namespace, String name, String value) { 228997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (attributes == null) 229997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu attributes = new Vector(); 230997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 231997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (namespace == null) 232997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu namespace = ""; 233997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 234997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu for (int i = attributes.size() - 1; i >= 0; i--) { 235997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu String[] attribut = (String[]) attributes.elementAt(i); 236997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (attribut[0].equals(namespace) && 237997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu attribut[1].equals(name)) { 238997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 239997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (value == null) { 240997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu attributes.removeElementAt(i); 241997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 242997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu else { 243997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu attribut[2] = value; 244997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 245997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return; 246997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 247997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 248997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 249997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu attributes.addElement 250997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu (new String[] { 251997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu namespace, name, value 252997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu }); 253997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 254997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 255997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** 256997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Sets the given prefix; a namespace value of null removess the 257997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * prefix */ 258997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 259997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public void setPrefix(String prefix, String namespace) { 260997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (prefixes == null) 261997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu prefixes = new Vector(); 262997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu prefixes.addElement(new String[] { 263997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu prefix, namespace 264997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu }); 265997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 266997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 267997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** 268997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * sets the name of the element */ 269997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 270997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public void setName(String name) { 271997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu this.name = name; 272997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 273997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 274997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** 275997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * sets the namespace of the element. Please note: For no 276997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * namespace, please use Xml.NO_NAMESPACE, null is not a legal 277997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * value. Currently, null is converted to Xml.NO_NAMESPACE, but 278997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * future versions may throw an exception. */ 279997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 280997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public void setNamespace(String namespace) { 281997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (namespace == null) 282997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu throw new NullPointerException("Use \"\" for empty namespace"); 283997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu this.namespace = namespace; 284997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 285997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 286997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** 287997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Sets the Parent of this element. Automatically called from the 288997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * add method. Please use with care, you can simply 289997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * create inconsitencies in the document tree structure using 290997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * this method! */ 291997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 292997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu protected void setParent(Node parent) { 293997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu this.parent = parent; 294997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 295997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 296997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** 297997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Writes this element and all children to the given XmlWriter. */ 298997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 299997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public void write(XmlSerializer writer) 300997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu throws IOException { 301997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 302997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (prefixes != null) { 303997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu for (int i = 0; i < prefixes.size(); i++) { 304997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu writer.setPrefix(getNamespacePrefix(i), getNamespaceUri(i)); 305997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 306997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 307997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 308997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu writer.startTag( 309997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu getNamespace(), 310997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu getName()); 311997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 312997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu int len = getAttributeCount(); 313997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 314997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu for (int i = 0; i < len; i++) { 315997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu writer.attribute( 316997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu getAttributeNamespace(i), 317997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu getAttributeName(i), 318997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu getAttributeValue(i)); 319997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 320997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 321997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu writeChildren(writer); 322997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 323997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu writer.endTag(getNamespace(), getName()); 324997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 325997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu} 326