【问题标题】:Getting started with XML::Parser [closed]XML::Parser 入门 [关闭]
【发布时间】:2011-12-22 20:28:36
【问题描述】:

我已经在谷歌上搜索了一段时间,以查找有关 Perl-XML-Parser 使用的信息。不过,作为一个新手,我无法完全理解文档或教程。

简单说一下我需要解析器做什么(没什么特别的,你会看到):

我想读入一个 XML 文件并将其转换成一个 LaTeX 文档。第二步,我想提取某些信息。

例如:

<body>
<head>Title</head>
<poem>
<l>xyz</l>
<l>xyz</l>
</poem>
</body>

这个示例-“XML”应该被转换成类似这样的东西:

\begin{document}
\chapter{Title}
\begin{verse}
xyz\\
xyz
\end{verse}
\end{document}

此外,我想将某些信息(例如&lt;l&gt;...&lt;/l&gt;-tags 之间的文本)放入一个数组/散列(可能连同前面的&lt;/l&gt;s 的数量)?。

我想,像这样的任务可以很容易地用解析器完成。问题是我对如何为 ex 进行初始化和自定义只有一个非常模糊的想法。 XML::Parser 模块。

如果有人能提供帮助,我将非常感激。

【问题讨论】:

  • 您是否因任何原因被绑定到 expat perl Xml::Parser?有更好和更标准化的方法来解析 xml,从而产生可以在 perl 世界之外转移的知识......
  • 你试过XML::Twig吗? Basic examples

标签: xml perl xml-parsing


【解决方案1】:

在 Perl 中处理 XML 的另一种可能性是 XML::XSH2:

use XML::XSH2;
xsh << 'end_xsh';
    open 8023786.xml ;
    cd body ;
    echo '\begin{document}' ;
    for poem {
        echo :s '\chapter{' preceding-sibling::head[1] '}' ;
        echo '\begin{verse}' ;
        for l echo :s text() xsh:if(following-sibling::*, '\\', '') ;
        echo '\end{verse}' ;
    }
    echo '\end{document}' ;
end_xsh

【讨论】:

  • 感谢使用强大的 XML::XSH2 :D
【解决方案2】:

将 XML 转换为 Latex 的“最佳”方法是使用 XSLT。

强烈建议:

1) 熟悉基本的 Perl XML。

或者,如果您对 Perl 之外的其他东西感觉更舒服,可以使用其他语言 - 大多数语言都有很好的 XML 库。

我强烈建议您完成本教程中的所有三个章节:

XML For Perl Developers

2) 熟悉使用 XSLT 样式表的基础知识。例如:

Investigating XSLT: The XML Transformation Language

3) 研究一些现成的 XML 到 Latex XSL 样式表。例如:

XML to LaTeX

...或...

Transforming XHTML to LaTeX

...或...

XSLT MathML Library

PS: 我赶紧补充一点,XSLT 方法与语言和平台无关。您可以在任何语言(Perl、Java、Python 等)和任何平台(Windows、Linux、MacOS 等)上使用此方法

【讨论】:

  • 非常感谢大家!我查看了您向我推荐的各种链接和文档。因为即使是最基本的文档我也很难理解(尽管我通常对 perl 和 LaTeX 文档很好),我认为这将是最好的解决方案,只是给我一本书并学习我需要了解的所有东西划痕。再次感谢。也许几天后我会再次需要你的建议。
【解决方案3】:

要完全控制 XML 翻译,请使用 SAX 实现 finite-state machine。 Perl 有 XML::SAX 和不同的解析器后端(XML::SAX::ExpatXSXML::LibXML::SAX)。这是一种可能的解决方案:

#!/usr/bin/env perl
package XML::SAX::Handler::XML2LaTeX;
use feature qw(say switch);
use strict;
use warnings qw(all);

use base qw(XML::SAX::Base);

sub new {
    return bless {
        data => '',
        line => [],
    } => __PACKAGE__;
}

sub start_element {
    my ($self, $el) = @_;
    $self->{data} = '';
    for ($el->{Name}) {
        when ('body') {
            say '\begin{document}';
        } when ('poem') {
            say '\begin{verse}';
            $self->{line} = [];
        }
    }
    return;
}

sub end_element {
    my ($self, $el) = @_;
    my $data = $self->{data};
    for ($el->{Name}) {
        when ('body') {
            say '\end{document}';
        } when ('head') {
            say "\\chapter{$data}";
        } when ('poem') {
            say join "\\\\\n", @{$self->{line}};
            say '\end{verse}';
        } when ('l') {
            push @{$self->{line}}, $data;
        }
    }
    return;
}

sub characters {
    my ($self, $data) = @_;
    $self->{data} .= $data->{Data};
    return;
}

1;

package main;
use strict;
use warnings qw(all);

use XML::SAX::PurePerl;

my $handler = XML::SAX::Handler::XML2LaTeX->new;
my $parser = XML::SAX::PurePerl->new(Handler => $handler);

$parser->parse_file(\*DATA);

__DATA__
<body>
<head>Title</head>
<poem>
<l>xyz</l>
<l>xyz</l>
</poem>
</body>

【讨论】:

    猜你喜欢
    • 2011-02-28
    • 2023-03-04
    • 2012-08-11
    • 2011-07-25
    • 2012-08-12
    • 2010-09-26
    • 2014-06-29
    • 2011-03-25
    • 2011-03-15
    相关资源
    最近更新 更多