All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sf.javagimmicks.xml.NameUtils Maven / Gradle / Ivy

There is a newer version: 0.99-alpha1
Show newest version
package net.sf.javagimmicks.xml;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * A helper for dealing with XML names.
 */
public class NameUtils
{
   private NameUtils()
   {}

   /**
    * Determines if the given name {@link String} is a valid XML non-colonized
    * name.
    * 
    * @param name
    *           the name {@link String} to test
    * @return if the given name is an XML NCName
    */
   public static boolean isNCName(final String name)
   {
      return name == null ? false : PA_NCNAME.matcher(name).matches();
   }

   /**
    * Determines if the given name {@link String} is a valid XML qualified name.
    * 

* An XML qualified name is a NCName which is optionally prefixed. *

* Examples: *

    *
  • my:name (prefixed)
  • *
  • name (non-prefixed)
  • *
* * @param name * the name {@link String} to test * @return if the given name is an XML qualified name */ public static boolean isQualifiedName(final String name) { return name == null ? false : PA_QNAME.matcher(name).matches(); } /** * Checks if a given name {@link String} is a valid XML NCName and throws an * {@link IllegalArgumentException} if not. * * @param name * the name {@link String} to test * @throws IllegalArgumentException * if the given name {@link String} is not a valid XML NCName * @see #isNCName(String) */ public static void checkNCName(final String name) throws IllegalArgumentException { if (!isNCName(name)) { throw new IllegalArgumentException("'" + name + "' isn't a valid XML NCName"); } } /** * Checks if a given name {@link String} is a valid XML qualified name and * throws an {@link IllegalArgumentException} if not. * * @param name * the name {@link String} to test * @throws IllegalArgumentException * if the given name {@link String} is not a valid XML qualified * name * @see #isQualifiedName(String) */ public static void checkQualifiedName(final String name) throws IllegalArgumentException { if (!isQualifiedName(name)) { throw new IllegalArgumentException("'" + name + "' isn't a valid XML qualified name"); } } /** * Creates a new XML qualified name {@link String} from a given (optional) * prefix and local name. * * @param prefix * an optional XML prefix * @param localName * the local name * @return an according (optionally prefixed) XML qualified name */ public static String buildQualifiedName(final String prefix, final String localName) { final StringBuilder result = new StringBuilder(); if (prefix != null && prefix.length() > 0) { result.append(prefix).append(':'); } result.append(localName); return result.toString(); } /** * Splits a given XML qualified name (with optional prefix) into it's * components. The result is always a {@link String} array with a size of * {@code 2} that contains the optional prefix at index {@code 0} (which may * be {@code null}) and the local name at index {@code 1}. * * @param qualifiedName * the qualified XML name to split * @return the components of the qualified name as a {@link String} array */ public static String[] splitQualifiedName(final String qualifiedName) { final Matcher matcher = PA_QNAME.matcher(qualifiedName); if (!matcher.matches()) { return null; } final String[] result = new String[2]; final String prefix = matcher.group(2); final String localName = matcher.group(3); result[0] = prefix == null ? "" : prefix; result[1] = localName; return result; } private static String charClass(final String... patterns) { final StringBuilder result = new StringBuilder(); result.append("["); for (final String pattern : patterns) { result.append(pattern); } result.append("]"); return result.toString(); } private static final String PS_BASE_CHAR = "[\\u0041-\\u005A][\\u0061-\\u007A][\\u00C0-\\u00D6][\\u00D8-\\u00F6][\\u00F8-\\u00FF][\\u0100-\\u0131][\\u0134-\\u013E][\\u0141-\\u0148][\\u014A-\\u017E][\\u0180-\\u01C3][\\u01CD-\\u01F0][\\u01F4-\\u01F5][\\u01FA-\\u0217][\\u0250-\\u02A8][\\u02BB-\\u02C1]\\u0386[\\u0388-\\u038A]\\u038C[\\u038E-\\u03A1][\\u03A3-\\u03CE][\\u03D0-\\u03D6]\\u03DA\\u03DC\\u03DE\\u03E0[\\u03E2-\\u03F3][\\u0401-\\u040C][\\u040E-\\u044F][\\u0451-\\u045C][\\u045E-\\u0481][\\u0490-\\u04C4][\\u04C7-\\u04C8][\\u04CB-\\u04CC][\\u04D0-\\u04EB][\\u04EE-\\u04F5][\\u04F8-\\u04F9][\\u0531-\\u0556]\\u0559[\\u0561-\\u0586][\\u05D0-\\u05EA][\\u05F0-\\u05F2][\\u0621-\\u063A][\\u0641-\\u064A][\\u0671-\\u06B7][\\u06BA-\\u06BE][\\u06C0-\\u06CE][\\u06D0-\\u06D3]\\u06D5[\\u06E5-\\u06E6][\\u0905-\\u0939]\\u093D[\\u0958-\\u0961][\\u0985-\\u098C][\\u098F-\\u0990][\\u0993-\\u09A8][\\u09AA-\\u09B0]\\u09B2[\\u09B6-\\u09B9][\\u09DC-\\u09DD][\\u09DF-\\u09E1][\\u09F0-\\u09F1][\\u0A05-\\u0A0A][\\u0A0F-\\u0A10][\\u0A13-\\u0A28][\\u0A2A-\\u0A30][\\u0A32-\\u0A33][\\u0A35-\\u0A36][\\u0A38-\\u0A39][\\u0A59-\\u0A5C]\\u0A5E[\\u0A72-\\u0A74][\\u0A85-\\u0A8B]\\u0A8D[\\u0A8F-\\u0A91][\\u0A93-\\u0AA8][\\u0AAA-\\u0AB0][\\u0AB2-\\u0AB3][\\u0AB5-\\u0AB9]\\u0ABD\\u0AE0[\\u0B05-\\u0B0C][\\u0B0F-\\u0B10][\\u0B13-\\u0B28][\\u0B2A-\\u0B30][\\u0B32-\\u0B33][\\u0B36-\\u0B39]\\u0B3D[\\u0B5C-\\u0B5D][\\u0B5F-\\u0B61][\\u0B85-\\u0B8A][\\u0B8E-\\u0B90][\\u0B92-\\u0B95][\\u0B99-\\u0B9A]\\u0B9C[\\u0B9E-\\u0B9F][\\u0BA3-\\u0BA4][\\u0BA8-\\u0BAA][\\u0BAE-\\u0BB5][\\u0BB7-\\u0BB9][\\u0C05-\\u0C0C][\\u0C0E-\\u0C10][\\u0C12-\\u0C28][\\u0C2A-\\u0C33][\\u0C35-\\u0C39][\\u0C60-\\u0C61][\\u0C85-\\u0C8C][\\u0C8E-\\u0C90][\\u0C92-\\u0CA8][\\u0CAA-\\u0CB3][\\u0CB5-\\u0CB9]\\u0CDE[\\u0CE0-\\u0CE1][\\u0D05-\\u0D0C][\\u0D0E-\\u0D10][\\u0D12-\\u0D28][\\u0D2A-\\u0D39][\\u0D60-\\u0D61][\\u0E01-\\u0E2E]\\u0E30[\\u0E32-\\u0E33][\\u0E40-\\u0E45][\\u0E81-\\u0E82]\\u0E84[\\u0E87-\\u0E88]\\u0E8A\\u0E8D[\\u0E94-\\u0E97][\\u0E99-\\u0E9F][\\u0EA1-\\u0EA3]\\u0EA5\\u0EA7[\\u0EAA-\\u0EAB][\\u0EAD-\\u0EAE]\\u0EB0[\\u0EB2-\\u0EB3]\\u0EBD[\\u0EC0-\\u0EC4][\\u0F40-\\u0F47][\\u0F49-\\u0F69][\\u10A0-\\u10C5][\\u10D0-\\u10F6]\\u1100[\\u1102-\\u1103][\\u1105-\\u1107]\\u1109[\\u110B-\\u110C][\\u110E-\\u1112]\\u113C\\u113E\\u1140\\u114C\\u114E\\u1150[\\u1154-\\u1155]\\u1159[\\u115F-\\u1161]\\u1163\\u1165\\u1167\\u1169[\\u116D-\\u116E][\\u1172-\\u1173]\\u1175\\u119E\\u11A8\\u11AB[\\u11AE-\\u11AF][\\u11B7-\\u11B8]\\u11BA[\\u11BC-\\u11C2]\\u11EB\\u11F0\\u11F9[\\u1E00-\\u1E9B][\\u1EA0-\\u1EF9][\\u1F00-\\u1F15][\\u1F18-\\u1F1D][\\u1F20-\\u1F45][\\u1F48-\\u1F4D][\\u1F50-\\u1F57]\\u1F59\\u1F5B\\u1F5D[\\u1F5F-\\u1F7D][\\u1F80-\\u1FB4][\\u1FB6-\\u1FBC]\\u1FBE[\\u1FC2-\\u1FC4][\\u1FC6-\\u1FCC][\\u1FD0-\\u1FD3][\\u1FD6-\\u1FDB][\\u1FE0-\\u1FEC][\\u1FF2-\\u1FF4][\\u1FF6-\\u1FFC]\\u2126[\\u212A-\\u212B]\\u212E[\\u2180-\\u2182][\\u3041-\\u3094][\\u30A1-\\u30FA][\\u3105-\\u312C][\\uAC00-\\uD7A3]"; private static final String PS_IDEOGRAPHIC = "[\\u4E00-\\u9FA5]\\u3007[\\u3021-\\u3029]"; private static final String PS_COMBINING_CHAR = "[\\u0300-\\u0345][\\u0360-\\u0361][\\u0483-\\u0486][\\u0591-\\u05A1][\\u05A3-\\u05B9][\\u05BB-\\u05BD]\\u05BF[\\u05C1-\\u05C2]\\u05C4[\\u064B-\\u0652]\\u0670[\\u06D6-\\u06DC][\\u06DD-\\u06DF][\\u06E0-\\u06E4][\\u06E7-\\u06E8][\\u06EA-\\u06ED][\\u0901-\\u0903]\\u093C[\\u093E-\\u094C]\\u094D[\\u0951-\\u0954][\\u0962-\\u0963][\\u0981-\\u0983]\\u09BC\\u09BE\\u09BF[\\u09C0-\\u09C4][\\u09C7-\\u09C8][\\u09CB-\\u09CD]\\u09D7[\\u09E2-\\u09E3]\\u0A02\\u0A3C\\u0A3E\\u0A3F[\\u0A40-\\u0A42][\\u0A47-\\u0A48][\\u0A4B-\\u0A4D][\\u0A70-\\u0A71][\\u0A81-\\u0A83]\\u0ABC[\\u0ABE-\\u0AC5][\\u0AC7-\\u0AC9][\\u0ACB-\\u0ACD][\\u0B01-\\u0B03]\\u0B3C[\\u0B3E-\\u0B43][\\u0B47-\\u0B48][\\u0B4B-\\u0B4D][\\u0B56-\\u0B57][\\u0B82-\\u0B83][\\u0BBE-\\u0BC2][\\u0BC6-\\u0BC8][\\u0BCA-\\u0BCD]\\u0BD7[\\u0C01-\\u0C03][\\u0C3E-\\u0C44][\\u0C46-\\u0C48][\\u0C4A-\\u0C4D][\\u0C55-\\u0C56][\\u0C82-\\u0C83][\\u0CBE-\\u0CC4][\\u0CC6-\\u0CC8][\\u0CCA-\\u0CCD][\\u0CD5-\\u0CD6][\\u0D02-\\u0D03][\\u0D3E-\\u0D43][\\u0D46-\\u0D48][\\u0D4A-\\u0D4D]\\u0D57\\u0E31[\\u0E34-\\u0E3A][\\u0E47-\\u0E4E]\\u0EB1[\\u0EB4-\\u0EB9][\\u0EBB-\\u0EBC][\\u0EC8-\\u0ECD][\\u0F18-\\u0F19]\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F[\\u0F71-\\u0F84][\\u0F86-\\u0F8B][\\u0F90-\\u0F95]\\u0F97[\\u0F99-\\u0FAD][\\u0FB1-\\u0FB7]\\u0FB9[\\u20D0-\\u20DC]\\u20E1[\\u302A-\\u302F]\\u3099\\u309A"; private static final String PS_EXTENDER = "\\u00B7\\u02D0\\u02D1\\u0387\\u0640\\u0E46\\u0EC6\\u3005[\\u3031-\\u3035][\\u309D-\\u309E][\\u30FC-\\u30FE]"; private static final String PS_DIGIT = "[\\u0030-\\u0039][\\u0660-\\u0669][\\u06F0-\\u06F9][\\u0966-\\u096F][\\u09E6-\\u09EF][\\u0A66-\\u0A6F][\\u0AE6-\\u0AEF][\\u0B66-\\u0B6F][\\u0BE7-\\u0BEF][\\u0C66-\\u0C6F][\\u0CE6-\\u0CEF][\\u0D66-\\u0D6F][\\u0E50-\\u0E59][\\u0ED0-\\u0ED9][\\u0F20-\\u0F29]"; private static final String PS_LETTER = charClass(PS_BASE_CHAR, PS_IDEOGRAPHIC); private static final String PS_NAME_CHAR = charClass(PS_LETTER, PS_DIGIT, "\\.\\-_:", PS_COMBINING_CHAR, PS_EXTENDER); private static final String PS_NCNAME_CHAR = charClass(PS_NAME_CHAR, "&&[^:]"); private static final String PS_NCNAME_START_CHAR = charClass(PS_LETTER, "_"); private static final String PS_NCNAME = PS_NCNAME_START_CHAR + PS_NCNAME_CHAR + "*"; private static final String PS_QNAME = "((" + PS_NCNAME + "):)?(" + PS_NCNAME + ")"; private static final Pattern PA_NCNAME = Pattern.compile(PS_NCNAME); private static final Pattern PA_QNAME = Pattern.compile(PS_QNAME); }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy