XML :: Parser入门

时间:2011-11-05 22:34:17

标签: xml perl xml-parsing

我一直在谷歌上搜索一段时间才能找到有关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}

此外,我想将某些信息(例如<l>...</l> - 标签之间的文本)放入数组/散列(可能与前面</l>的数量一起)?

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

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

3 个答案:

答案 0 :(得分:2)

在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

答案 1 :(得分:1)

将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等)上使用此方法

答案 2 :(得分:0)

要完全控制XML翻译,请使用finite-state machine实施SAX。 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>