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