2012-03-29 45 views
0

我有一个文件,我正在解析自己。每当我发现了一个“<”或“>”我分割字符串,像这样:解析包含文件的字符串时出错

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> 

这里的问题是,它会分裂的所有“<”和“>”这样的描述,我正在寻找丢失的部分。

我该如何解决描述和其他我正在搜索的标签,其中包含多个“<”和“>”,我不在乎? (那些不是围绕开口标记和结束标记?

+0

如果这实际上是XML,为什么不使用XML解析器? – 2012-03-29 05:44:30

+0

我想学习如何做我自己......通过它思考和分析它自己 – BigBug 2012-03-29 05:45:27

+0

WY不要试图一个标准的XML解析器? – Nishant 2012-03-29 05:46:13

回答

1

Trail: Java API for XML Processing并请忘记»让我们在[<>]尽快再次将一个字符串分解成为可能。

+0

谢谢,但我不想使用API​​,我想建立自己的.. – BigBug 2012-03-29 05:46:37

+0

尽管你想,这个答案仍然是一样的。 – Joey 2012-03-29 05:47:14

2

正确的解析器和正则表达式之间的一个主要区别是解析器使用了一个堆栈,因此它可以跟踪嵌套结构。在尖括号中给出了一个平坦的字符串列表,没有指示哪些元素嵌套在其他元素中;这就是为什么它找不到结束标签匹配给定的开始标签。

想想如果XML文件中包含该发生的事情:

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

当你看到<foo>,你不能只是寻找下一个</foo>并承担之间是身体一切。

你需要做的是当你看到一个开始标签时,把它推到你当前“在”的一堆元素上。当您看到一个结束标记时,请检查它是否与堆栈中最顶端的开始标记匹配。如果是这样,从堆栈中弹出该标签 - 你不再属于这个元素。如果不匹配,则表示发生错误;输入有<foo></bar>或类似的东西。

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

+0

感谢您的意见,事实上有帮助,不像很多其他评论,我一直在接受... – BigBug 2012-03-29 07:25:34

+0

而且这个答案不会完成,没有一个链接[所有StackOverflow上最高的答案](http ://stackoverflow.com/a/1732454/226975)。 :-) – Wyzard 2012-03-29 07:34:51

+0

顺便说一下,您可能有兴趣使用SAX或StAX,或者至少研究其API以获得教育价值。他们负责较低层次的解析,因此您可以将该文件视为一系列开始标记和结束标记,而不是一系列字符,但它们会将所有有意义的解释(以及与堆栈相关的东西)留给应用程序。 – Wyzard 2012-03-29 07:47:10

相关问题