【发布时间】:2017-01-09 07:51:52
【问题描述】:
我有一些内容,我想知道它们是否是XML。怎么做 ?我只需要从方法返回类型中知道答案true 或false。我计划使用正则表达式,但愿意接受更好的建议。
XML内容如下,格式不变(可能分子ID会增加或减少),
<?xml version="1.0" encoding="UTF-8"?>
<molecules>
<molecule id="1">
<atoms>
<atom id="1" symbol="C"/>
<atom id="2" symbol="C"/>
<atom id="3" symbol="N"/>
</atoms>
<bonds>
<bond id="1" atomAId="1" atomBId="2" order="SINGLE"/>
<bond id="2" atomAId="2" atomBId="3" order="DOUBLE"/>
</bonds>
</molecule>
<molecule id="2">
<atoms>
<atom id="1" symbol="C"/>
<atom id="2" symbol="C"/>
<atom id="3" symbol="N"/>
</atoms>
<bonds>
<bond id="1" atomAId="1" atomBId="2" order="SINGLE"/>
<bond id="2" atomAId="2" atomBId="3" order="DOUBLE"/>
</bonds>
</molecule>
</molecules>
我使Regex 识别XML 如下,
public static final String REGEX_FOR_XML = "((<(\\S(.*?))(\\s.*?)?>(.*?)<\\/\\3>)|(<\\S(.*?)(.*?)(\\/>)))";
问题是它只匹配内部内容,而我想匹配整个内容。我使用这个验证器进行匹配,
public static boolean isValidXML(String inXMLStr) {
if (inXMLStr == null || inXMLStr.isEmpty())
return false;
final Pattern pattern = Pattern.compile(Constants.REGEX_FOR_XML);
if (pattern.matcher(inXMLStr).matches()) {
return true;
}
return false;
}
如何更正Regex 以匹配XML 内容或如何做更好的选择?
【问题讨论】:
-
为什么不只解析 XML 而不是使用正则表达式?
-
帮自己一个忙,不要为此使用正则表达式。您似乎想要进行架构验证。也许这会对你有所帮助:docs.oracle.com/javase/tutorial/jaxp/dom/validating.html 请注意,我故意不写这个作为答案,因为它似乎是一个 X-Y 问题,并且该建议不能回答你的问题,但希望能解决你的问题。
-
@Baby 我不同意这个副本。他似乎没有尝试读取 XML 或从中获取值,而只是验证它。
-
没错,我认为它不是重复的。
-
忍不住链接到这个答案:stackoverflow.com/a/1732454/13075