-1

我知道 SO 不尊重这类问题,但我投入了大量时间尝试为 perl 选择最佳 XML 操作库,而且我发现几乎没有任何示例可以清楚地了解如何插入值和打印输出生成的 xml 到一个字符串变量。

这是我传入的没有值的 XML:

my $GetLibByNameAndVersionEnvelope = '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
                                            <s:Body>
                                                <GetLibByNameAndVersion xmlns="LibService">
                                                    <name></name>
                                                    <version></version>
                                                </GetGridLibByNameAndVersion>
                                            </s:Body>
                                        </s:Envelope>';

我需要用测试值填充名称和版本节点。请提供一个关于如何执行此操作的示例,因此,我有一个包含所需 XML 的字符串。

4

2 回答 2

3

这是一个 SOAP 请求,对吧?

如果只是这个看起来总是一样的简单 SOAP 调用,我建议您使用模板引擎,放入占位符,并且根本不要使用 XML 模块。那会便宜很多。

您可以使用Text::Template之类的东西并将模板放在文件系统中的某个位置(这样您就可以将其添加到版本控制中),也可以简单地将其添加到该DATA部分的代码中,甚至作为简单的字符串变量。你当然可以把它作为这样的字符串放入:

my $ua = LWP::UserAgent->new;
my $res = $ua->post($url, <<"SOAP");
<s:Envelope>
  <s:Body>
    <GetLibByNameAndVersion xmlns="LibService">
      <name>$name</name>
      <version>$version</version>
    </GetGridLibByNameAndVersion>
  </s:Body>
</s:Envelope>
SOAP

该示例不是很动态,如果 API 发生更改,您需要更改代码。但是对于一个非常简单的请求,这是最快的方法。如果您的 API 中只有一个相当简单的方法,我觉得有时这(或模板)是可行的方法。

于 2013-02-06T12:01:20.330 回答
3

更新:你知道 Perl 有一整套专门处理 SOAP 的模块吗? 这篇文章似乎是一个不错的起点。

XML::Twig在他们的网站上有一个教程列表。我推荐这个教程,它很老,但肯定会涵盖你感兴趣的所有东西。

此外,CPAN 文档几乎总是有很好的简单示例来说明如何使用模块。 XML::Twig的文档当然可以也是如此XML::Simple

这是一篇关于使用XML::Simple.

于 2013-02-06T12:06:51.210 回答