【问题标题】:Text::Balanced and multiline xml文本::平衡和多行 xml
【发布时间】:2023-03-15 08:28:01
【问题描述】:

我好像有点迷路了。

我需要解析一个大(大约 100 mb)且非常丑陋的 xml 文件。如果我使用parsefile,它会返回错误(文档元素后的垃圾),但它会很乐意解析文件的较小元素。

所以我决定将文件分解为元素并解析它们。由于不鼓励使用正则表达式解析 XML(无论如何我都尝试过,但结果重复),我尝试了Text::Balanced

有点像

use Text::Balanced qw/extract_tagged/;

while (<FILE>) {
     my $result = extract_tagged($_, "<tag>");
     print $result if defined $result;
}

工作得很好,所以我可以提取适合一行的标记条目。然而,有了更大的东西

use Text::Balanced qw/extract_tagged/;
use File::Slurp;

my $test = read_file("file");
my $result = extract_tagged($text, "<tag>");
print $result;

不起作用。它读取文件,但在那里找不到标记的项目。

所以问题是如何在没有XML::Parser 的情况下提取给定标签之间的任何内容?如果可能的话,我真的真的需要避免咀嚼它。

附:搜索将返回正则表达式指南、heredoc howtos 以及除我查找的内容之外的任何内容

P.P.S.我是个白痴,一直在尝试解析无效文件。如果解析器失败,仍然很好奇如何截取文件。


bvr 的回答很接近,它确实会检索一些数据,但如果缺少顶级标签则不会。

【问题讨论】:

    标签: xml perl


    【解决方案1】:

    对于损坏的 XML,我会尝试将 recover 选项设置为 XML::LibXML。它使它忽略解析错误并继续。

    【讨论】:

    • 非常 Perl 的答案:你明白你的意思。我将对损坏的文件启用恢复模式运行解析器,如果它设法提取信息,我将其标记为答案。
    【解决方案2】:

    使用Text::Balanced 进行 XML 解析就像使用瑞士刀进行心脏直视手术 - 仅仅因为你能做到并不意味着你应该这样做。

    如果XML::Parser 给您带来困难,请尝试更新的 XML 解析库,例如 XML::LibXMLXML::Twig

    【讨论】:

    • XML::Twig 返回与 XML::Parser (它基于)相同的错误,到目前为止,XML::LibXML 对我来说似乎太复杂了。我想将文件拆分成更小的部分并解析它们。
    • 哎呀。看来我超级傻。我搞砸了文件 - 切断了顶级开始标签 - 并试图解析损坏的 xml。真丢人!仍然想知道如何“切碎”一个 xml 文件,以防万一我不得不处理损坏的 xml 文件。
    猜你喜欢
    • 1970-01-01
    • 2016-04-24
    • 2011-02-23
    • 2012-05-30
    • 1970-01-01
    • 2023-04-05
    • 2021-06-28
    • 1970-01-01
    • 2018-07-26
    相关资源
    最近更新 更多