【问题标题】:in XML:TWIG, how to stop parsing once find the interested element在 XML:TWIG 中,一旦找到感兴趣的元素,如何停止解析
【发布时间】:2019-12-10 21:14:53
【问题描述】:

我只想解析一个感兴趣的 xml 元素(例如,见下文:名称等于数学的类元素),并且我想在解析第一个达到此条件的元素时停止。 (由于只有一个名为 math 的类,所以一旦找到元素就不必继续了)。

但是,如果我按如下方式实现,代码会在找到我感兴趣的元素后继续读取整个文件(xml 文件很长,因此需要很长时间)。我的问题是,一旦解析了 name = math 的第一个类元素,如何停止它?

my $twig = new XML::Twig(TwigRoots => {"class[\@name='math']" => \&class}); $twig->parsefile( shift @ARGV );

此外,我还想在解析后从xml文件中删除这个类(不仅仅是从内存中),以便下次解析具有其他名称的类时,不会解析该类元素。有可能这样做吗?

【问题讨论】:

    标签: perl xml-twig


    【解决方案1】:

    看来您正在寻找的是 XML::Twig 的 finish_printfinish_now

    完成打印

    停止树枝处理,冲洗树枝并继续完成打印 文件尽可能快。采用 修改文档时的此方法 修改完毕。

    现在完成

    停止 twig 处理,未完成对文档的解析(其中 实际上可能不是格式正确的 在finish_now所在的点之后 称为)。执行后恢复 Lparse> 或 parsefile 调用。内容 树枝的内容是这样解析的 远(当时所有打开的元素 finish_now 被称为被认为是 关闭)。

    【讨论】:

    • 这里是一个使用finish_now的例子:cpansearch.perl.org/src/MIROD/XML-Twig-3.35/tools/xml_grep/…
    • 感谢 DVK。看来我必须安装 perl 5.10.X 才能在我的 sys.是 5.8.4。安装 5.10.X 容易吗?此外,即使使用finish_now,如果一个类在一个有很多内容的类之后,仍然需要时间来定位到那里。我可以指出一个行号,从哪里开始 twig 开始解析元素?我可以使用 grep 来获取所有类元素的行号。为什么要让twig一行行寻找感兴趣的元素,这么慢?
    • 总而言之,假设 name=math 的类从第 2000 行开始,我可以让 twig 从第 2000 行解析 xml,而不从 xml 文件的开头开始吗?即使我设置了 TwigRoots => {"class[\@name='math'],我也不明白为什么 twig 会花这么多时间解析我的 xml 文件。我认为它应该有某种方式跳过读取其他下的子元素类。也许我错了,它仍然逐行解析,只是不要将它们存储在内存中。
    猜你喜欢
    • 2020-02-10
    • 2012-05-16
    • 1970-01-01
    • 2011-08-10
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    相关资源
    最近更新 更多