Mercurial Hosting > luan
comparison src/goodjava/xml/XmlParser.java @ 1468:35f3bfd4f51d
xml
| author | Franklin Schmidt <fschmidt@gmail.com> |
|---|---|
| date | Tue, 14 Apr 2020 08:44:33 -0600 |
| parents | 670b7d089699 |
| children | 0246add03d11 |
comparison
equal
deleted
inserted
replaced
| 1467:509d49c493c0 | 1468:35f3bfd4f51d |
|---|---|
| 56 Map.Entry<String,String> attribute; | 56 Map.Entry<String,String> attribute; |
| 57 while( (attribute=attribute()) != null ) { | 57 while( (attribute=attribute()) != null ) { |
| 58 attributes.put(attribute.getKey(),attribute.getValue()); | 58 attributes.put(attribute.getKey(),attribute.getValue()); |
| 59 } | 59 } |
| 60 spaces(); | 60 spaces(); |
| 61 if( parser.match("/>") ) { | |
| 62 XmlElement element = new XmlElement(name,attributes); | |
| 63 return parser.success(element); | |
| 64 } | |
| 61 required(">"); | 65 required(">"); |
| 62 String s = string(name); | 66 String s = string(name); |
| 63 if( s != null ) { | 67 if( s != null ) { |
| 64 XmlElement element = new XmlElement(name,attributes,s); | 68 XmlElement element = new XmlElement(name,attributes,s); |
| 65 return parser.success(element); | 69 return parser.success(element); |
| 74 | 78 |
| 75 private String string(String name) throws ParseException { | 79 private String string(String name) throws ParseException { |
| 76 int start = parser.begin(); | 80 int start = parser.begin(); |
| 77 while( parser.noneOf("<") ); | 81 while( parser.noneOf("<") ); |
| 78 String s = parser.textFrom(start); | 82 String s = parser.textFrom(start); |
| 83 s = decode(s); | |
| 79 if( !endTag(name) ) | 84 if( !endTag(name) ) |
| 80 return parser.failure(null); | 85 return parser.failure(null); |
| 81 return parser.success(s); | 86 return parser.success(s); |
| 82 } | 87 } |
| 83 | 88 |
| 123 while( !parser.test(quote) ) { | 128 while( !parser.test(quote) ) { |
| 124 if( !parser.anyChar() ) | 129 if( !parser.anyChar() ) |
| 125 throw exception("unclosed attribute value"); | 130 throw exception("unclosed attribute value"); |
| 126 } | 131 } |
| 127 String value = parser.textFrom(start); | 132 String value = parser.textFrom(start); |
| 133 value = decode(value); | |
| 128 parser.match(quote); | 134 parser.match(quote); |
| 129 Map.Entry<String,String> attribute = new AbstractMap.SimpleImmutableEntry<String,String>(name,value); | 135 Map.Entry<String,String> attribute = new AbstractMap.SimpleImmutableEntry<String,String>(name,value); |
| 130 return parser.success(attribute); | 136 return parser.success(attribute); |
| 131 } | 137 } |
| 132 | 138 |
| 167 | 173 |
| 168 private boolean matchSpace() { | 174 private boolean matchSpace() { |
| 169 return parser.anyOf(" \t\r\n"); | 175 return parser.anyOf(" \t\r\n"); |
| 170 } | 176 } |
| 171 | 177 |
| 178 private static String decode(String s) { | |
| 179 s = s.replace("<","<"); | |
| 180 s = s.replace(">",">"); | |
| 181 s = s.replace(""","\""); | |
| 182 s = s.replace("'","'"); | |
| 183 s = s.replace("&","&"); | |
| 184 return s; | |
| 185 } | |
| 186 | |
| 172 } | 187 } |
