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.util.*; 24997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.io.*; 25997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport org.xmlpull.v1.*; 26997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 27997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu/** A common base class for Document and Element, also used for 28997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu storing XML fragments. */ 29997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 30997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yupublic class Node { //implements XmlIO{ 31997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 32997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public static final int DOCUMENT = 0; 33997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public static final int ELEMENT = 2; 34997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public static final int TEXT = 4; 35997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public static final int CDSECT = 5; 36997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public static final int ENTITY_REF = 6; 37997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public static final int IGNORABLE_WHITESPACE = 7; 38997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public static final int PROCESSING_INSTRUCTION = 8; 39997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public static final int COMMENT = 9; 40997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public static final int DOCDECL = 10; 41997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 42997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu protected Vector children; 43997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu protected StringBuffer types; 44997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 45997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** inserts the given child object of the given type at the 46997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu given index. */ 47997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 48997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public void addChild(int index, int type, Object child) { 49997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 50997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (child == null) 51997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu throw new NullPointerException(); 52997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 53997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (children == null) { 54997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu children = new Vector(); 55997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu types = new StringBuffer(); 56997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 57997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 58997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (type == ELEMENT) { 59997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (!(child instanceof Element)) 60997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu throw new RuntimeException("Element obj expected)"); 61997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 62997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu ((Element) child).setParent(this); 63997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 64997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu else if (!(child instanceof String)) 65997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu throw new RuntimeException("String expected"); 66997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 67997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu children.insertElementAt(child, index); 68997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu types.insert(index, (char) type); 69997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 70997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 71997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** convenience method for addChild (getChildCount (), child) */ 72997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 73997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public void addChild(int type, Object child) { 74997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu addChild(getChildCount(), type, child); 75997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 76997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 77997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** Builds a default element with the given properties. Elements 78997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu should always be created using this method instead of the 79997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu constructor in order to enable construction of specialized 80997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu subclasses by deriving custom Document classes. Please note: 81997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu For no namespace, please use Xml.NO_NAMESPACE, null is not a 82997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu legal value. Currently, null is converted to Xml.NO_NAMESPACE, 83997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu but future versions may throw an exception. */ 84997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 85997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public Element createElement(String namespace, String name) { 86997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 87997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu Element e = new Element(); 88997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu e.namespace = namespace == null ? "" : namespace; 89997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu e.name = name; 90997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return e; 91997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 92997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 93997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** Returns the child object at the given index. For child 94997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu elements, an Element object is returned. For all other child 95997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu types, a String is returned. */ 96997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 97997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public Object getChild(int index) { 98997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return children.elementAt(index); 99997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 100997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 101997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** Returns the number of child objects */ 102997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 103997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public int getChildCount() { 104997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return children == null ? 0 : children.size(); 105997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 106997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 107997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** returns the element at the given index. If the node at the 108997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu given index is a text node, null is returned */ 109997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 110997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public Element getElement(int index) { 111997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu Object child = getChild(index); 112997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return (child instanceof Element) ? (Element) child : null; 113997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 114997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 115997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** Returns the element with the given namespace and name. If the 116997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu element is not found, or more than one matching elements are 117997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu found, an exception is thrown. */ 118997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 119997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public Element getElement(String namespace, String name) { 120997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 121997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu int i = indexOf(namespace, name, 0); 122997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu int j = indexOf(namespace, name, i + 1); 123997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 124997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (i == -1 || j != -1) 125997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu throw new RuntimeException( 126997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu "Element {" 127997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu + namespace 128997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu + "}" 129997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu + name 130997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu + (i == -1 ? " not found in " : " more than once in ") 131997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu + this); 132997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 133997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return getElement(i); 134997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 135997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 136997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /* returns "#document-fragment". For elements, the element name is returned 137997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 138997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public String getName() { 139997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return "#document-fragment"; 140997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 141997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 142997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** Returns the namespace of the current element. For Node 143997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu and Document, Xml.NO_NAMESPACE is returned. 144997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 145997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public String getNamespace() { 146997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return ""; 147997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 148997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 149997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public int getNamespaceCount () { 150997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return 0; 151997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 152997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 153997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** returns the text content if the element has text-only 154997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu content. Throws an exception for mixed content 155997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 156997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public String getText() { 157997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 158997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu StringBuffer buf = new StringBuffer(); 159997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu int len = getChildCount(); 160997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 161997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu for (int i = 0; i < len; i++) { 162997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (isText(i)) 163997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu buf.append(getText(i)); 164997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu else if (getType(i) == ELEMENT) 165997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu throw new RuntimeException("not text-only content!"); 166997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 167997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 168997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return buf.toString(); 169997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 170997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu */ 171997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 172997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** Returns the text node with the given index or null if the node 173997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu with the given index is not a text node. */ 174997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 175997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public String getText(int index) { 176997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return (isText(index)) ? (String) getChild(index) : null; 177997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 178997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 179997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** Returns the type of the child at the given index. Possible 180997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu types are ELEMENT, TEXT, COMMENT, and PROCESSING_INSTRUCTION */ 181997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 182997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public int getType(int index) { 183997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return types.charAt(index); 184997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 185997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 186997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** Convenience method for indexOf (getNamespace (), name, 187997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu startIndex). 188997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 189997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public int indexOf(String name, int startIndex) { 190997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return indexOf(getNamespace(), name, startIndex); 191997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 192997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu */ 193997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 194997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** Performs search for an element with the given namespace and 195997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu name, starting at the given start index. A null namespace 196997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu matches any namespace, please use Xml.NO_NAMESPACE for no 197997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu namespace). returns -1 if no matching element was found. */ 198997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 199997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public int indexOf(String namespace, String name, int startIndex) { 200997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 201997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu int len = getChildCount(); 202997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 203997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu for (int i = startIndex; i < len; i++) { 204997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 205997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu Element child = getElement(i); 206997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 207997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (child != null 208997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu && name.equals(child.getName()) 209997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu && (namespace == null || namespace.equals(child.getNamespace()))) 210997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return i; 211997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 212997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return -1; 213997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 214997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 215997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public boolean isText(int i) { 216997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu int t = getType(i); 217997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return t == TEXT || t == IGNORABLE_WHITESPACE || t == CDSECT; 218997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 219997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 220997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** Recursively builds the child elements from the given parser 221997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu until an end tag or end document is found. 222997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu The end tag is not consumed. */ 223997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 224997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public void parse(XmlPullParser parser) 225997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu throws IOException, XmlPullParserException { 226997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 227997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu boolean leave = false; 228997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 229997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu do { 230997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu int type = parser.getEventType(); 231997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 232997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // System.out.println(parser.getPositionDescription()); 233997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 234997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu switch (type) { 235997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 236997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu case XmlPullParser.START_TAG: { 237997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu Element child = 238997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu createElement( 239997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu parser.getNamespace(), 240997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu parser.getName()); 241997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // child.setAttributes (event.getAttributes ()); 242997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu addChild(ELEMENT, child); 243997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 244997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // order is important here since 245997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // setparent may perform some init code! 246997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 247997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu child.parse(parser); 248997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu break; 249997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 250997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 251997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu case XmlPullParser.END_DOCUMENT: 252997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu case XmlPullParser.END_TAG: 253997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu leave = true; 254997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu break; 255997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 256997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu default: 257997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (parser.getText() != null) 258997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu addChild( 259997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu type == XmlPullParser.ENTITY_REF ? TEXT : type, 260997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu parser.getText()); 261997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu else if (type == XmlPullParser.ENTITY_REF 262997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu && parser.getName() != null) { 263997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu addChild(ENTITY_REF, parser.getName()); 264997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 265997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu parser.nextToken(); 266997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 267997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } while (!leave); 268997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 269997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 270997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** Removes the child object at the given index */ 271997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 272997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public void removeChild(int idx) { 273997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu children.removeElementAt(idx); 274997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 275997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /*** Modification by HHS - start ***/ 276997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // types.deleteCharAt (index); 277997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /***/ 278997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu int n = types.length() - 1; 279997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 280997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu for (int i = idx; i < n; i++) 281997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu types.setCharAt(i, types.charAt(i + 1)); 282997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 283997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu types.setLength(n); 284997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 285997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /*** Modification by HHS - end ***/ 286997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 287997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 288997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /* returns a valid XML representation of this Element including 289997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu attributes and children. 290997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public String toString() { 291997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu try { 292997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu ByteArrayOutputStream bos = 293997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu new ByteArrayOutputStream(); 294997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu XmlWriter xw = 295997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu new XmlWriter(new OutputStreamWriter(bos)); 296997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu write(xw); 297997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu xw.close(); 298997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return new String(bos.toByteArray()); 299997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 300997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu catch (IOException e) { 301997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu throw new RuntimeException(e.toString()); 302997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 303997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 304997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu */ 305997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 306997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** Writes this node to the given XmlWriter. For node and document, 307997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu this method is identical to writeChildren, except that the 308997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu stream is flushed automatically. */ 309997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 310997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public void write(XmlSerializer writer) throws IOException { 311997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu writeChildren(writer); 312997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu writer.flush(); 313997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 314997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 315997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** Writes the children of this node to the given XmlWriter. */ 316997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 317997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public void writeChildren(XmlSerializer writer) throws IOException { 318997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (children == null) 319997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return; 320997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 321997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu int len = children.size(); 322997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 323997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu for (int i = 0; i < len; i++) { 324997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu int type = getType(i); 325997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu Object child = children.elementAt(i); 326997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu switch (type) { 327997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu case ELEMENT: 328997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu ((Element) child).write(writer); 329997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu break; 330997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 331997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu case TEXT: 332997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu writer.text((String) child); 333997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu break; 334997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 335997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu case IGNORABLE_WHITESPACE: 336997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu writer.ignorableWhitespace((String) child); 337997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu break; 338997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 339997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu case CDSECT: 340997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu writer.cdsect((String) child); 341997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu break; 342997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 343997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu case COMMENT: 344997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu writer.comment((String) child); 345997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu break; 346997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 347997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu case ENTITY_REF: 348997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu writer.entityRef((String) child); 349997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu break; 350997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 351997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu case PROCESSING_INSTRUCTION: 352997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu writer.processingInstruction((String) child); 353997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu break; 354997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 355997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu case DOCDECL: 356997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu writer.docdecl((String) child); 357997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu break; 358997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 359997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu default: 360997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu throw new RuntimeException("Illegal type: " + type); 361997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 362997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 363997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 364997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu} 365