2 ******************************************************************************
3 * Copyright (C) 2007-2010, International Business Machines Corporation and *
4 * others. All Rights Reserved. *
5 ******************************************************************************
8 package com.ibm.icu.impl.duration.impl;
10 import java.io.IOException;
11 import java.io.Reader;
12 import java.util.ArrayList;
13 import java.util.List;
15 import com.ibm.icu.lang.UCharacter;
17 public class XMLRecordReader implements RecordReader {
20 private List<String> nameStack;
22 private boolean atTag;
24 private String tag; // cache
26 public XMLRecordReader(Reader r) {
28 this.nameStack = new ArrayList<String>();
31 if (getTag().startsWith("?xml")) {
36 if (getTag().startsWith("!--")) {
41 public boolean open(String title) {
42 if (getTag().equals(title)) {
50 public boolean close() {
51 int ix = nameStack.size() - 1;
52 String name = nameStack.get(ix);
53 if (getTag().equals("/" + name)) {
61 public boolean bool(String name) {
62 String s = string(name);
64 return "true".equals(s);
69 public boolean[] boolArray(String name) {
70 String[] sa = stringArray(name);
72 boolean[] result = new boolean[sa.length];
73 for (int i = 0; i < sa.length; ++i) {
74 result[i] = "true".equals(sa[i]);
81 public char character(String name) {
82 String s = string(name);
89 public char[] characterArray(String name) {
90 String[] sa = stringArray(name);
92 char[] result = new char[sa.length];
93 for (int i = 0; i < sa.length; ++i) {
94 result[i] = sa[i].charAt(0);
101 public byte namedIndex(String name, String[] names) {
102 String sa = string(name);
104 for (int i = 0; i < names.length; ++i) {
105 if (sa.equals(names[i])) {
113 public byte[] namedIndexArray(String name, String[] names) {
114 String[] sa = stringArray(name);
116 byte[] result = new byte[sa.length];
117 loop: for (int i = 0; i < sa.length; ++i) {
119 for (int j = 0; j < names.length; ++j) {
120 if (names[j].equals(s)) {
121 result[i] = (byte) j;
125 result[i] = (byte) -1;
132 public String string(String name) {
134 String result = readData();
135 if (match("/" + name)) {
142 public String[] stringArray(String name) {
143 if (match(name + "List")) {
144 List<String> list = new ArrayList<String>();
146 while (null != (s = string(name))) {
147 if ("Null".equals(s)) {
152 if (match("/" + name + "List")) {
153 return list.toArray(new String[list.size()]);
159 public String[][] stringTable(String name) {
160 if (match(name + "Table")) {
161 List<String[]> list = new ArrayList<String[]>();
163 while (null != (sa = stringArray(name))) {
166 if (match("/" + name + "Table")) {
167 return list.toArray(new String[list.size()][]);
173 private boolean match(String target) {
174 if (getTag().equals(target)) {
175 // System.out.println("match '" + target + "'");
182 private String getTag() {
189 private void advance() {
193 private String readData() {
194 StringBuilder sb = new StringBuilder();
195 boolean inWhitespace = false;
196 // boolean inAmp = false;
199 if (c == -1 || c == '<') {
206 StringBuilder numBuf = new StringBuilder();
213 while (c != ';' && c != -1) {
214 numBuf.append((char) c);
218 int num = Integer.parseInt(numBuf.toString(), radix);
220 } catch (NumberFormatException ex) {
221 System.err.println("numbuf: " + numBuf.toString()
222 + " radix: " + radix);
226 StringBuilder charBuf = new StringBuilder();
227 while (c != ';' && c != -1) {
228 charBuf.append((char) c);
231 String charName = charBuf.toString();
232 if (charName.equals("lt")) {
234 } else if (charName.equals("gt")) {
236 } else if (charName.equals("quot")) {
238 } else if (charName.equals("apos")) {
240 } else if (charName.equals("amp")) {
243 System.err.println("unrecognized character entity: '"
250 if (UCharacter.isWhitespace(c)) {
257 inWhitespace = false;
261 //System.err.println("read data: '" + sb.toString() + "'");
262 return sb.toString();
265 private String readNextTag() {
269 if (c == '<' || c == -1) {
275 if (!UCharacter.isWhitespace(c)) {
276 System.err.println("Unexpected non-whitespace character "
277 + Integer.toHexString(c));
284 StringBuilder sb = new StringBuilder();
287 if (c == '>' || c == -1) {
292 // System.err.println("read tag: '" + sb.toString() + "'");
293 return sb.toString();
301 } catch (IOException e) {
302 // assume end of input