Example usage for org.json XMLTokener nextMeta

List of usage examples for org.json XMLTokener nextMeta

Introduction

In this page you can find the example usage for org.json XMLTokener nextMeta.

Prototype

public Object nextMeta() throws JSONException 

Source Link

Document

Returns the next XML meta token.

Usage

From source file:org.official.json.JSONML.java

/**
 * Parse XML values and store them in a JSONArray.
 * @param x       The XMLTokener containing the source string.
 * @param arrayForm true if array form, false if object form.
 * @param ja      The JSONArray that is containing the current tag or null
 *     if we are at the outermost level.
 * @return A JSONArray if the value is the outermost tag, otherwise null.
 * @throws JSONException/*from  w  w  w . j a  v  a 2 s .co  m*/
 */
private static Object parse(XMLTokener x, boolean arrayForm, JSONArray ja) throws JSONException {
    String attribute;
    char c;
    String closeTag = null;
    int i;
    JSONArray newja = null;
    JSONObject newjo = null;
    Object token;
    String tagName = null;

    // Test for and skip past these forms:
    //      <!-- ... -->
    //      <![  ... ]]>
    //      <!   ...   >
    //      <?   ...  ?>

    while (true) {
        if (!x.more()) {
            throw x.syntaxError("Bad XML");
        }
        token = x.nextContent();
        if (token == XML.LT) {
            token = x.nextToken();
            if (token instanceof Character) {
                if (token == XML.SLASH) {

                    // Close tag </

                    token = x.nextToken();
                    if (!(token instanceof String)) {
                        throw new JSONException("Expected a closing name instead of '" + token + "'.");
                    }
                    if (x.nextToken() != XML.GT) {
                        throw x.syntaxError("Misshaped close tag");
                    }
                    return token;
                } else if (token == XML.BANG) {

                    // <!

                    c = x.next();
                    if (c == '-') {
                        if (x.next() == '-') {
                            x.skipPast("-->");
                        } else {
                            x.back();
                        }
                    } else if (c == '[') {
                        token = x.nextToken();
                        if (token.equals("CDATA") && x.next() == '[') {
                            if (ja != null) {
                                ja.put(x.nextCDATA());
                            }
                        } else {
                            throw x.syntaxError("Expected 'CDATA['");
                        }
                    } else {
                        i = 1;
                        do {
                            token = x.nextMeta();
                            if (token == null) {
                                throw x.syntaxError("Missing '>' after '<!'.");
                            } else if (token == XML.LT) {
                                i += 1;
                            } else if (token == XML.GT) {
                                i -= 1;
                            }
                        } while (i > 0);
                    }
                } else if (token == XML.QUEST) {

                    // <?

                    x.skipPast("?>");
                } else {
                    throw x.syntaxError("Misshaped tag");
                }

                // Open tag <

            } else {
                if (!(token instanceof String)) {
                    throw x.syntaxError("Bad tagName '" + token + "'.");
                }
                tagName = (String) token;
                newja = new JSONArray();
                newjo = new JSONObject();
                if (arrayForm) {
                    newja.put(tagName);
                    if (ja != null) {
                        ja.put(newja);
                    }
                } else {
                    newjo.put("tagName", tagName);
                    if (ja != null) {
                        ja.put(newjo);
                    }
                }
                token = null;
                for (;;) {
                    if (token == null) {
                        token = x.nextToken();
                    }
                    if (token == null) {
                        throw x.syntaxError("Misshaped tag");
                    }
                    if (!(token instanceof String)) {
                        break;
                    }

                    // attribute = value

                    attribute = (String) token;
                    if (!arrayForm && ("tagName".equals(attribute) || "childNode".equals(attribute))) {
                        throw x.syntaxError("Reserved attribute.");
                    }
                    token = x.nextToken();
                    if (token == XML.EQ) {
                        token = x.nextToken();
                        if (!(token instanceof String)) {
                            throw x.syntaxError("Missing value");
                        }
                        newjo.accumulate(attribute, XML.stringToValue((String) token));
                        token = null;
                    } else {
                        newjo.accumulate(attribute, "");
                    }
                }
                if (arrayForm && newjo.length() > 0) {
                    newja.put(newjo);
                }

                // Empty tag <.../>

                if (token == XML.SLASH) {
                    if (x.nextToken() != XML.GT) {
                        throw x.syntaxError("Misshaped tag");
                    }
                    if (ja == null) {
                        if (arrayForm) {
                            return newja;
                        } else {
                            return newjo;
                        }
                    }

                    // Content, between <...> and </...>

                } else {
                    if (token != XML.GT) {
                        throw x.syntaxError("Misshaped tag");
                    }
                    closeTag = (String) parse(x, arrayForm, newja);
                    if (closeTag != null) {
                        if (!closeTag.equals(tagName)) {
                            throw x.syntaxError("Mismatched '" + tagName + "' and '" + closeTag + "'");
                        }
                        tagName = null;
                        if (!arrayForm && newja.length() > 0) {
                            newjo.put("childNodes", newja);
                        }
                        if (ja == null) {
                            if (arrayForm) {
                                return newja;
                            } else {
                                return newjo;
                            }
                        }
                    }
                }
            }
        } else {
            if (ja != null) {
                ja.put(token instanceof String ? XML.stringToValue((String) token) : token);
            }
        }
    }
}