【问题标题】:Trouble parsing a string containing a file解析包含文件的字符串时遇到问题
【发布时间】:2012-03-29 05:42:03
【问题描述】:

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

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>

这里的问题是它会在所有“”上分开,所以我正在寻找的描述部分会丢失。

如何绕过描述以及我正在搜索的其他标签,其中包含多个我不关心的“”? (没有围绕开始标签和结束标签的那些?

【问题讨论】:

  • 如果这实际上是 XML,为什么不使用 XML 解析器?
  • 我想自己学习如何做......思考并自己解析它
  • 为什么不尝试标准的 XML 解析器?
  • @BlueMonster:从根本上说,使用正则表达式解析 XML 是个坏主意。我相信您可以了解更多富有成效的内容。
  • 谢谢...但是...我不是在向您询问我应该和不应该将时间花在什么方面的建议...我是在询问对特定 Q 和我被困在的一个问题......更具体地说是对解决方案的想法

标签: java string parsing


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    当您看到&lt;foo&gt; 时,您不能只寻找下一个&lt;/foo&gt; 并假设介于两者之间的所有内容都是主体。

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

    对于 HTML(相对于 XML),它更复杂,因为一些结束标签是可选的:例如,&lt;div&gt;&lt;p&gt;&lt;/div&gt; 不是错误。您可以阅读 HTML 规范并找出所有规则和特殊情况,您可以只使用现有的可用解析器库之一,并为自己省去很多麻烦。

    【讨论】:

    • 感谢 Wyzard 的建议,这实际上很有帮助,与我收到的许多其他 cmets 不同...
    • 如果没有most upvoted answer on all of StackOverflow 的链接,这个答案是不完整的。 :-)
    • 顺便说一句,您可能有兴趣使用 SAX 或 StAX,或者至少研究它们的 API 以获得教育价值。它们负责较低级别的解析,因此您可以将文件视为一系列开始标签和结束标签,而不是一系列字符,但它们将所有有意义的解释(以及与堆栈相关的内容)留给应用程序.
    • 大声笑谢谢,我实际上很喜欢那里的一个答案,它谈到了一组有限的“已知”html标签 - 这正是我正在做的......它不是一个通用的解析器。 . 只是我正在制作一个来捕获我正在寻找的特定数据。再次感谢:)
    【解决方案3】:

    Trail: Java API for XML Processing,请忘记»让我们尽快在[&lt;&gt;] 处拆分一个字符串。

    【讨论】:

    • 尽管您想要,但这个答案保持不变。
    猜你喜欢
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    相关资源
    最近更新 更多