XMLTokener.java
上传用户:shen332233
上传日期:2021-09-03
资源大小:7478k
文件大小:8k
源码类别:

Ajax

开发平台:

Java

  1. package org.json;
  2. /*
  3. Copyright (c) 2002 JSON.org
  4. Permission is hereby granted, free of charge, to any person obtaining a copy 
  5. of this software and associated documentation files (the "Software"), to deal 
  6. in the Software without restriction, including without limitation the rights 
  7. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
  8. copies of the Software, and to permit persons to whom the Software is 
  9. furnished to do so, subject to the following conditions:
  10. The above copyright notice and this permission notice shall be included in all 
  11. copies or substantial portions of the Software.
  12. The Software shall be used for Good, not Evil.
  13. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
  14. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
  15. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
  16. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
  17. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
  18. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 
  19. SOFTWARE.
  20. */
  21. import java.text.ParseException;
  22. /**
  23.  * The XMLTokener extends the JSONTokener to provide additional methods
  24.  * for the parsing of XML texts.
  25.  * @author JSON.org
  26.  * @version 0.1
  27.  */
  28. public class XMLTokener extends JSONTokener {
  29.    /** The table of entity values. It initially contains Character values for
  30.     * amp, apos, gt, lt, quot.
  31.     */
  32.    public static final java.util.HashMap entity;
  33.    static {
  34.        entity = new java.util.HashMap(8);
  35.        entity.put("amp",  XML.AMP);
  36.        entity.put("apos", XML.APOS);
  37.        entity.put("gt",   XML.GT);
  38.        entity.put("lt",   XML.LT);
  39.        entity.put("quot", XML.QUOT);
  40.    }
  41.     /**
  42.      * Construct an XMLTokener from a string.
  43.      * @param s A source string.
  44.      */
  45.     public XMLTokener(String s) {
  46.         super(s);
  47.     }
  48.     /**
  49.      * Get the next XML outer token, trimming whitespace. There are two kinds
  50.      * of tokens: the '<' character which begins a markup tag, and the content
  51.      * text between markup tags.
  52.      *
  53.      * @return  A string, or a '<' Character, or null if there is no more
  54.      * source text.
  55.      * @throws ParseException
  56.      */
  57.     public Object nextContent() throws ParseException {
  58.         char         c;
  59.         StringBuffer sb;
  60.         do {
  61.             c = next();
  62.         } while (Character.isWhitespace(c));
  63.         if (c == 0) {
  64.             return null;
  65.         }
  66.         if (c == '<') {
  67.             return XML.LT;
  68.         }
  69.         sb = new StringBuffer();
  70.         while (true) {
  71.             if (c == '<' || c == 0) {
  72.                 back();
  73.                 return sb.toString().trim();
  74.             }
  75.             if (c == '&') {
  76.                 sb.append(nextEntity(c));
  77.             } else {
  78.                 sb.append(c);
  79.             }
  80.             c = next();
  81.         }
  82.     }
  83.     /**
  84.      * Return the next entity. These entities are translated to Characters:
  85.      *     &amp;  &apos;  &gt;  &lt;  &quot;
  86.      * @param a An ampersand character.
  87.      * @return  A Character or an entity String if the entity is not recognized.
  88.      * @throws ParseException Missing ';' in XML entity
  89.      */
  90.     public Object nextEntity(char a) throws ParseException {
  91.         StringBuffer sb = new StringBuffer();
  92.         while (true) {
  93.             char c = next();
  94.             if (Character.isLetter(c)) {
  95.                 sb.append(Character.toLowerCase(c));
  96.             } else if (c == ';') {
  97.                 break;
  98.             } else {
  99.                 throw syntaxError("Missing ';' in XML entity: &" + sb);
  100.             }
  101.         }
  102.         String s = sb.toString();
  103.         Object e = entity.get(s);
  104.         if (e != null) {
  105.             return e;
  106.         } else {
  107.             return a + s + ";";
  108.         }
  109.     }
  110.     /**
  111.      * Returns the next XML meta token. This is used for skipping over <!...>
  112.      * and <?...?> structures.
  113.      * @return Syntax characters (< > / = ! ?) are returned as Character, and
  114.      * strings and names are returned as Boolean. We don't care what the
  115.      * values actually are.
  116.      * @throws ParseException
  117.      */
  118.     public Object nextMeta() throws ParseException {
  119.         char c;
  120.         char q;
  121.         do {
  122.             c = next();
  123.         } while (Character.isWhitespace(c));
  124.         switch (c) {
  125.         case 0:
  126.             throw syntaxError("Misshaped meta tag.");
  127.         case '<':
  128.             return XML.LT;
  129.         case '>':
  130.             return XML.GT;
  131.         case '/':
  132.             return XML.SLASH;
  133.         case '=':
  134.             return XML.EQ;
  135.         case '!':
  136.             return XML.BANG;
  137.         case '?':
  138.             return XML.QUEST;
  139.         case '"':
  140.         case ''':
  141.             q = c;
  142.             while (true) {
  143.                 c = next();
  144.                 if (c == 0) {
  145.                     throw syntaxError("Unterminated string.");
  146.                 }
  147.                 if (c == q) {
  148.                     return Boolean.TRUE;
  149.                 }
  150.             }
  151.         default:
  152.             while (true) {
  153.                 c = next();
  154.                 if (Character.isWhitespace(c)) {
  155.                     return Boolean.TRUE;
  156.                 }
  157.                 switch (c) {
  158.                 case 0:
  159.                 case '<':
  160.                 case '>':
  161.                 case '/':
  162.                 case '=':
  163.                 case '!':
  164.                 case '?':
  165.                 case '"':
  166.                 case ''':
  167.                     back();
  168.                     return Boolean.TRUE;
  169.                 }
  170.             }
  171.         }
  172.     }
  173.     /**
  174.      * Get the next XML Token. These tokens are found inside of angle
  175.      * brackets. It may be one of these characters: / > = ! ? or it may be a
  176.      * string wrapped in single quotes or double quotes, or it may be a name.
  177.      * @return a String or a Character.
  178.      * @throws ParseException
  179.      */
  180.     public Object nextToken() throws ParseException {
  181.         char c;
  182.         char q;
  183.         StringBuffer sb;
  184.         do {
  185.             c = next();
  186.         } while (Character.isWhitespace(c));
  187.         switch (c) {
  188.         case 0:
  189.             throw syntaxError("Misshaped element.");
  190.         case '<':
  191.             throw syntaxError("Misplaced '<'.");
  192.         case '>':
  193.             return XML.GT;
  194.         case '/':
  195.             return XML.SLASH;
  196.         case '=':
  197.             return XML.EQ;
  198.         case '!':
  199.             return XML.BANG;
  200.         case '?':
  201.             return XML.QUEST;
  202. // Quoted string
  203.         case '"':
  204.         case ''':
  205.             q = c;
  206.             sb = new StringBuffer();
  207.             while (true) {
  208.                 c = next();
  209.                 if (c == 0) {
  210.                     throw syntaxError("Unterminated string.");
  211.                 }
  212.                 if (c == q) {
  213.                     return sb.toString();
  214.                 }
  215.                 if (c == '&') {
  216.                     sb.append(nextEntity(c));
  217.                 } else {
  218.                     sb.append(c);
  219.                 }
  220.             }
  221.         default:
  222. // Name
  223.             sb = new StringBuffer();
  224.             while (true) {
  225.                 sb.append(c);
  226.                 c = next();
  227.                 if (Character.isWhitespace(c)) {
  228.                     return sb.toString();
  229.                 }
  230.                 switch (c) {
  231.                 case 0:
  232.                 case '>':
  233.                 case '/':
  234.                 case '=':
  235.                 case '!':
  236.                 case '?':
  237.                     back();
  238.                     return sb.toString();
  239.                 case '<':
  240.                 case '"':
  241.                 case ''':
  242.                     throw syntaxError("Bad character in a name.");
  243.                 }
  244.             }
  245.         }
  246.     }
  247. }