无法解析包含文件的字符串

时间:2012-03-29 05:42:04

标签: java string parsing

我有一个文件,我正在解析自己。每次我发现“<”或“>”我像这样拆分字符串:

xml = file.split("[<>]"); 

这将为我提供标签,数据和结束标签。

一旦完成,我确定它是什么类型的标签并以不同方式处理它。在它是项目标签的情况下,它具有描述。像这样:

<description>
<![CDATA[
<img width="460" height="259" src="http://www.cbc.ca/gfx/images/news/topstories/2012/03/28/hi-parliament-stop-852-7931-6col.jpg"><br/><p>Finance Minister Jim Flaherty's budget will take the shine off what critics call MPs' gold-plated pensions, reports Greg Weston for CBC News.</p>
]]>
</description>

这里的问题是它将拆分所有“&lt;”和“&gt;”所以我正在寻找的描述部分迷失了。

我如何绕过描述以及我正在搜索的其他可能包含多个“&lt;”的标签和“&gt;”哪个我不在乎? (那些不包围开头标签和结束标签的那些?

3 个答案:

答案 0 :(得分:3)

如果你想学习如何编写一个好的XML解析器,那么为什么不看一些open source XML parsers呢?阅读来源,卢克!

答案 1 :(得分:2)

正确的解析器和正则表达式之间的一个关键区别是解析器使用堆栈,因此它可以跟踪嵌套结构。只需在尖括号上拆分就可以得到一个扁平的字符串列表,而不会指示哪些元素嵌套在其他元素中;这就是为什么它找不到与给定开始标记匹配的结束标记。

考虑如果XML文件包含以下内容会发生什么:

<foo>
  <foo>
  </foo>
</foo>

当您看到<foo>时,您不能只查找下一个</foo>并假设其间的所有内容都是正文。

您需要做的是当您看到一个开始标记时,将其推送到您当前“在...内”的一堆元素上。当您看到结束标记时,请检查它是否与堆栈中最顶层的开始标记匹配。如果是,则从堆栈中弹出该标记 - 您不再位于该元素内。如果不匹配,则发出错误信号;输入有<foo></bar>或类似的东西。

对于HTML(而不是XML),它更复杂,因为某些结束标记是可选的:例如,<div><p></div>不是错误。您可以阅读HTML规范并找出所有规则和特殊情况,您可以使用现有的解析器库之一,并为您节省很多麻烦。

答案 2 :(得分:1)

Trail: Java API for XML Processing请忘记»让我们再次在[<>]分割一个字符串。