Example usage for org.json XMLTokener nextContent

List of usage examples for org.json XMLTokener nextContent

Introduction

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

Prototype

public Object nextContent() throws JSONException 

Source Link

Document

Get the next XML outer token, trimming whitespace.

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/* ww w. j ava  2 s .c  o  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);
            }
        }
    }
}