我有一个文件,我正在解析自己。每次我发现“<”或“>”我像这样拆分字符串:
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;”哪个我不在乎? (那些不包围开头标签和结束标签的那些?
答案 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请忘记»让我们再次在[<>]
分割一个字符串。