你知道java中的函数会将字符串验证为一个好的XML元素名称。
表格w3schools:
XML元素必须遵循这些命名 规则:
- 名称可以包含字母,数字和其他字符
- 名称不能以数字或标点符号开头
- 名称不能以字母xml(或XML,或Xml等)
开头- 名称不能包含空格
醇>
我发现了提供正则表达式解决方案的其他问题,是不是已经有了这个功能呢?
答案 0 :(得分:13)
如果您使用的是Xerces XML解析器,则可以使用XMLChar(或XML11Char)类isValidName()
method,如下所示:
org.apache.xerces.util.XMLChar.isValidName(String name)
isValidName
还有示例代码available here。
答案 1 :(得分:4)
规范中的相关产品是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 :(得分:1)
使用org.apache.xerces实用程序是一个很好的方法;但是,如果您需要坚持使用标准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);
}