我是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>
答案 0 :(得分:0)
“没有解析器解析XML”没有好的解决方案。只有“编写解析器”或“使用现有解析器”。
所以 - 写一个解析器。
首先阅读XML spec。它很长,让你知道你应该能够处理什么。
然后编写一些实现它的代码。为了比较:
(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 功能之一是错误是致命的,所以至少你不必处理一些非常糟糕的标记嵌套方案。