【发布时间】:2017-05-25 08:37:34
【问题描述】:
我正在尝试为 RSS 源设计我的自定义 XML 阅读器。以下是我在测试中的 JAVA 代码:
Pattern pattern = Pattern.compile("<(item)(.*?)>((.*))</\\1>", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher("<item value=\"key\" atr='none'><title val=\"has value\">Good</title><link>www</link></item>"
+ "<item value=\"key\" atr='none'><title val=\"has value\">Bad</title><link>http</link></item>"
+ "<item value=\"key\" atr='none'><title val=\"has value\">Neutral</title><link>ftp</link></item>");
while (matcher.find()) {
for (int i = 0; i < matcher.groupCount(); i++) {
System.out.println("\n" + i + ":" + matcher.group(i));
}}
这是输出:
0:<item value="key" atr='none'><title val="has value">Good</title><link>www</link></item><item value="key" atr='none'><title val="has value">Bad</title><link>http</link></item><item value="key" atr='none'><title val="has value">Neutral</title><link>ftp</link></item>
1:item
2: value="key" atr='none'
3:<title val="has value">Good</title><link>www</link></item><item value="key" atr='none'><title val="has value">Bad</title><link>http</link></item><item value="key" atr='none'><title val="has value">Neutral</title><link>ftp</link>
期望的输出:
<title val="has value">Good</title><link>www</link>
<title val="has value">Bad</title><link>http</link>
<title val="has value">Neutral</title><link>ftp</link>
基本上,我希望循环运行的时间与源字符串中存在的项目标签数量一样多。目前,正则表达式中的第 3 组正在提取字符串,直到与第 1 组匹配的最后一个结束标记,情况并非如此。第三组应包含字符串,直到匹配第一组的相应结束标记。
编辑: 根据@11thdimension 的建议,我正在添加一些我需要的更多信息:
- XML 结构还可以在 ITEM 标记中包含其他标记,例如日期、作者等。代码还应使用标题和链接标记检索这些标记。
- 标签的层次结构不固定。它们可以是任何顺序:标题、链接、日期或链接、标题、日期或日期、链接、标题等。
【问题讨论】:
-
为什么不使用现有的 XML 解析器之一呢?正则表达式不是适合这项工作的工具...
-
@Lucero 我试过了,但是它们很慢并且需要太多开销。据我所知,JAVA 没有任何内置的 XML 解析器。我们必须依赖外部资源。此外,XML 结构可能因来源而异。如果发生这种情况,那么为具有不同标记名称的不同 XML 结构进行编码就不那么健壮了。所以我正在根据我的需要设计一个可以读取多个结构的简单 XML Parser。我并不是说我发展得最好,但它最适合我。
-
我认为你错了。第一个 XML 支持已经与 Java 捆绑了很长时间(另请参阅 *.com/questions/9430392/…)。只要输入是有效的 XML,第二个 XML 解析器就完全独立于结构,这与基于正则表达式的解析器大不相同。第三,如果您想比较顺序解析性能,请不要将 XML 读入 DOM 表示,而是使用阅读器。
-
至于你的正则表达式实现,永远不要在没有惰性限定符的情况下使用
.*这样的事情,你总是会自取其辱。请注意,.可能与您期望的不匹配,除非您添加DOTALL标志。但这并没有改变将正则表达式用于标记化之外的根本缺陷;它无法处理递归和配对,因此在读取结构化数据时总会在某些时候让您失败。
标签: java regex xml pattern-matching