2015-05-04 73 views
-2

我有一个非常短的XML字符串从另一个应用程序传递给我的应用程序,我只对提取“level”标签之间的内容感兴趣。其解决方案是在这两者之间更好:正则表达式vs子串

String xmlString = 
"<type> 
<perm> 
<date>99999999</date> 
<level>admin</level> 
</perm> 
</type>"; 

String level = xmlString.substring(xmlString.indexOf("<level>") + "<level>".length(), 
          xmlString.indexOf("</level>")); 

Pattern p1 = Pattern.compile("<level>(\\S+)</level>"); 
Matcher m = p1.matcher(xmlString); 
if (m.find()) { 
    String level = m.group(1); 
} 
+1

最好的解决方案是第三个:使用XML解析器。 – Biffen

+0

这不是一个真正的xml文件,没有验证,没有文档类型...因为我没有控制它,我宁愿把它当作一个字符串.... Xpath被用在过去,并会导致“内容不是允许在序言“和”SAX:解析可能不会被称为解析“错误,由于此错误:https://bugs.openjdk.java.net/browse/JDK-8047329 – bez

回答

0

你试过基准标记你自己呢?从我读过的东西看来,你通常想首先使用正则表达式,如果你不能优化它,那么试试substring。不过,我有点困惑,为什么你不使用类似XmlObject.factory来处理你的XML解析。 https://xmlbeans.apache.org/docs/2.0.0/reference/org/apache/xmlbeans/XmlObject.Factory.html

+0

如果这取决于我这个字符串是一个对象,而不是一个XML,但因为它不是一个有效的XML,我只需要阅读它的一行,我宁愿把它作为一个字符串,特别是因为解析为XML导致大量问题和并发问题在大量。我使用多线程测试了这两种方法,子字符串方法比正则表达式稍快,但这两种方法比用Xpath工厂解析要快得多,这在过去被证明是不可靠的。 – bez

+0

然后我会用子串去,如果它对你最好。对我来说,维护比正则表达式更容易,所以它是两全其美的。 – CodyEngel