在不使用模块的情况下解析XML文件

时间:2016-05-02 20:06:42

标签: xml perl

我是Perl的新手,我需要学习如何解析基本的XML文件(我说的是基本的,就像几个嵌套的标签一样)。这是一个学习练习,以帮助我们理解一些中间解析技术。所以我做了我通常做的事情,google做了一些例子。但是,所有搜索结果都使用XML :: Parser或XML :: Simple等模块。我需要在没有这样的模块的情况下做到这一点。

有没有人知道任何有用的资源来查找Perl XML解析这些模块的示例。我听说使用堆栈对嵌套标签很有用(并检查标签是否正确关闭)。

这是我需要解析的一个例子。我需要能够从标签内部提取所有内容,当然还有标签的名称:

<?xml version="1.0"?>
 <employee>
   <name>Bill</name>
   <age>22</age>
   <address>123 Bark St.</address>
   <manager>
    <name>Jack</name>
    <age>45</age>
   </manager>
  </employee>

1 个答案:

答案 0 :(得分:0)

“没有解析器解析XML”没有好的解决方案。只有“编写解析器”或“使用现有解析器”。

所以 - 写一个解析器。

首先阅读XML spec。它很长,让你知道你应该能够处理什么。

然后编写一些实现它的代码。为了比较:

XML::Twig

XML::LibXML

XML::Simple也是一个XML库,but see here for why it's "discouraged"

注意 - 即使XML::LibXML确实广泛地使用了库,它们也很长。

然后阅读这个,为什么正则表达式是个坏主意: RegEx match open tags except XHTML self-contained tags

现在,考虑到所有这些 - “编写解析器”的任务比表面上看起来要困难得多,因为XML中的更多内容比您想象的要多。

然后你设置的这个任务实际上是非常可怕的 - 因为最好所有你可以实际完成的是一种假的解析器,如果你将XML特性集限制为你被呈现了什么。这对于基于正则表达式的解析器很糟糕的所有原因都是不好的 - 不是你不能使它工作,而是它依赖于一组不安全的假设。

所以 - 你可以为你的 XML写一个解析器,以及与它非常相似的东西 - 但它不是一个XML解析器,而且它会是脆弱的代码 - 这只是令人讨厌的。

但是,考虑到这一点 - 你可以使用递归标记匹配来伪装它。例如。每次点击开始标记时递归一个新的“级别”,并在点击结束标记时“折叠”。 XML规范的 nice 功能之一是错误是致命的,所以至少你不必处理一些非常糟糕的标记嵌套方案。