首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java -如何检查字符串是否是有效的XML元素名称?

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

Stack Overflow用户
提问于 2011-03-22 18:37:19
回答 4查看 13K关注 0票数 12

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

表格w3schools:

XML元素必须遵循以下命名规则:

  1. 名称可以包含字母、数字和其他字符。
  2. 名称不能以数字或标点符号开头。
  3. 名称不能以字母XML (或Xml或xml等)开头。
  4. 名称不能包含空格

我发现了其他提供regex解决方案的问题,难道没有这样的函数吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-22 18:47:01

如果使用Xerces XML解析器,可以使用XMLChar (或XML11Char)类方法,如下所示:

代码语言:javascript
复制
org.apache.xerces.util.XMLChar.isValidName(String name)

还有用于可在这里找到的示例代码isValidName

票数 13
EN

Stack Overflow用户

发布于 2011-03-22 18:44:17

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

名称::== NameStartChar NameChar * “NameStartChar ::= ":”\xF8 Z\x37F#x200C#x1FFF#x200C-#x218F#x218F #x2C00-#x2FEF #x3001-#xD7FF #xF900#xFF900#xFFDCFxFf0#xFFFD #x10000-#xEFFFF #xFFFD#x10000#xEFFFF#x218F#x2C00#x2C00-#xD7FF#xF900#xFF900#xFFFxFF0#xFFFD#xFF10000#xEFFFF#xFFFD#xEFFFF#xFFFD#xFFFD#xEFFFF#xFFFD#x2FF#xFFFD#x2FF#x2FF#xFFFD#x200C#x218F#x218F#x2C00-#xD7FF#xF900#xFF900#xF8#x2FF#x NameChar ::= NameStartChar \

因此,匹配它的正则表达式是

代码语言:javascript
复制
"^[: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"

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

代码语言:javascript
复制
"^[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)

票数 4
EN

Stack Overflow用户

发布于 2011-03-22 19:15:23

使用org.apache.xerces实用程序是一个很好的方法;但是,如果您需要坚持使用作为标准Java一部分的Java代码,那么下面的代码就可以做到这一点:

代码语言:javascript
复制
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);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5396164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档