有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何检查字符串是否是有效的XML元素名?

您知道java中的函数吗?该函数将验证字符串是否是一个好的XML元素名

表格W3学校:

XML elements must follow these naming rules:

  1. Names can contain letters, numbers, and other characters
  2. Names cannot start with a number or punctuation character
  3. Names cannot start with the letters xml (or XML, or Xml, etc)
  4. Names cannot contain spaces

我还发现了其他提供正则表达式解决方案的问题,难道没有一个函数可以做到这一点吗


共 (4) 个答案

  1. # 1 楼答案

    规范中的相关产品为http://www.w3.org/TR/xml/#NT-Name

    Name ::== NameStartChar NameChar *

    NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]

    NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]

    所以一个与之匹配的正则表达式是

    "^[:A-Z_a-z\\u00C0\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02ff\\u0370-\\u037d"
    + "\\u037f-\\u1fff\\u200c\\u200d\\u2070-\\u218f\\u2c00-\\u2fef\\u3001-\\ud7ff"
    + "\\uf900-\\ufdcf\\ufdf0-\\ufffd\\x10000-\\xEFFFF]"
    + "[:A-Z_a-z\\u00C0\\u00D6\\u00D8-\\u00F6"
    + "\\u00F8-\\u02ff\\u0370-\\u037d\\u037f-\\u1fff\\u200c\\u200d\\u2070-\\u218f"
    + "\\u2c00-\\u2fef\\u3001-\\udfff\\uf900-\\ufdcf\\ufdf0-\\ufffd\\-\\.0-9"
    + "\\u00b7\\u0300-\\u036f\\u203f-\\u2040]*\\Z"
    

    如果你想处理有名称空间的名字,你需要确保最多有一个冒号,所以

    "^[A-Z_a-z\\u00C0\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02ff\\u0370-\\u037d"
    + "\\u037f-\\u1fff\\u200c\\u200d\\u2070-\\u218f\\u2c00-\\u2fef\\u3001-\\udfff"
    + "\\uf900-\\ufdcf\\ufdf0-\\ufffd]"
    + "[A-Z_a-z\\u00C0\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02ff\\u0370-\\u037d"
    + "\\u037f-\\u1fff\\u200c\\u200d\\u2070-\\u218f\\u2c00-\\u2fef\\u3001-\\udfff"
    + "\\uf900-\\ufdcf\\ufdf0-\\ufffd\\-\\.0-9\\u00b7\\u0300-\\u036f\\u203f-\\u2040]*"
    + "(?::[A-Z_a-z\\u00C0\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02ff\\u0370-\\u037d"
    + "\\u037f-\\u1fff\\u200c\\u200d\\u2070-\\u218f\\u2c00-\\u2fef\\u3001-\\udfff"
    + "\\uf900-\\ufdcf\\ufdf0-\\ufffd]"
    + "[A-Z_a-z\\u00C0\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02ff\\u0370-\\u037d"
    + "\\u037f-\\u1fff\\u200c\\u200d\\u2070-\\u218f\\u2c00-\\u2fef\\u3001-\\udfff"
    + "\\uf900-\\ufdcf\\ufdf0-\\ufffd\\-\\.0-9\\u00b7\\u0300-\\u036f\\u203f-\\u2040]*)?\\Z"
    

    (错过了另一个03gf;两个都改为036f)

  2. # 2 楼答案

    作为对accepted answer的当前添加:

    至少Oracle的JDK 1.8(可能也是旧版本)在非公共com.sun.*包中内部使用Xerces解析器。您不应该直接使用这些类的任何实现,因为它们可能会在未来版本的JDK中更改,而无需另行通知!但是,xml元素名称有效性检查所需的代码封装得非常好,可以复制到您自己的代码中。这样,就可以避免对外部库的另一种依赖

    这是从内部类com.sun.org.apache.xerces.internal.util.XMLChar获取的必需代码:

    public class XMLChar {
    
        /** Character flags. */
        private static final byte[] CHARS = new byte[1 << 16];
    
        /** Name start character mask. */
        public static final int MASK_NAME_START = 0x04;
    
        /** Name character mask. */
        public static final int MASK_NAME = 0x08;
    
        static {
            // Initializing the Character Flag Array
            // Code generated by: XMLCharGenerator.
    
            CHARS[9] = 35;
            CHARS[10] = 19;
            CHARS[13] = 19;
    
            // ...
            // the entire static block must be copied
        }
    
        /**
         * Check to see if a string is a valid Name according to [5]
         * in the XML 1.0 Recommendation
         *
         * @param name string to check
         * @return true if name is a valid Name
         */
        public static boolean isValidName(String name) {
            final int length = name.length();
            if (length == 0) {
                return false;
            }
            char ch = name.charAt(0);
            if (!isNameStart(ch)) {
                return false;
            }
            for (int i = 1; i < length; ++i) {
                ch = name.charAt(i);
                if (!isName(ch)) {
                    return false;
                }
            }
            return true;
        }
    
        /**
         * Returns true if the specified character is a valid name start
         * character as defined by production [5] in the XML 1.0
         * specification.
         *
         * @param c The character to check.
         */
        public static boolean isNameStart(int c) {
            return c < 0x10000 && (CHARS[c] & MASK_NAME_START) != 0;
        }
    
        /**
         * Returns true if the specified character is a valid name
         * character as defined by production [4] in the XML 1.0
         * specification.
         *
         * @param c The character to check.
         */
        public static boolean isName(int c) {
            return c < 0x10000 && (CHARS[c] & MASK_NAME) != 0;
        }
    }
    
  3. # 3 楼答案

    如果您使用的是Xerces XML解析器,那么可以使用XMLChar(或XML11Char)类^{} method,如下所示:

    org.apache.xerces.util.XMLChar.isValidName(String name)
    

    还有isValidName的样本代码available here

  4. # 4 楼答案

    使用组织。阿帕奇。xerces utilities是一个不错的选择;但是,如果您需要坚持使用标准Java API中的Java代码,那么下面的代码可以做到这一点:

    public void parse(String xml) throws Exception {
    
        XMLReader parser = XMLReaderFactory.createXMLReader();
        parser.setContentHandler(new DefaultHandler());
        InputSource source = new InputSource(new ByteArrayInputStream(xml.getBytes()));
        parser.parse(source);
    }