Perl - 帮助通过CMD线读取xml字符串

时间:2011-03-21 13:00:40

标签: perl shift

我工作的地方有一段我们在需要与Perl交互时使用的代码。基本上我们调用一个函数,它通过一系列字符串 - 通过命令行 - 作为数组传递给Perl。这适用于大多数事情。

但是我现在需要传递一串XML数据。我通常使用shift关键字从数组中提取项目。但是,因为xml字符串中有多个空格,所以这不起作用。

我试过这样写:

while(shift)
{
   my $temp = shift;
   $animalXML = $animalXML.$temp;

}

但它并不能很好地处理xml标签。例如,本节:

<?xml version="1.0" encoding="utf-16"?><ToggleExclusion   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

读取并存储为:

version="1.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

有人知道如何解决这个问题吗?

感谢。

3 个答案:

答案 0 :(得分:3)

这不是Perl问题,这是命令行引用问题。如果您正确引用字符串,它将作为单个ARGV项目进入Perl脚本,您不必进行任何操作。

答案 1 :(得分:1)

您正在撰写单个字符串并将其传递给Run,然后显然(这是哪种语言和平台?)将其提供给命令行解释器(cmd/bin/sh ?)解析该命令行,将其解释为命令的名称和参数,并使用参数调用该命令。

命令行解释器有自己的特殊字符,例如<,因此所有出现的此类字符都需要使用命令行解释器支持的任何方法正确转义或引用,以便被安然无恙地传递给命令。此外,命令行解释器将对所使用的字符集有一定的期望,这些期望可能不适用于所有UTF-16的输入字符串,或者更糟糕的是UTF-16和其他东西的混合。

如果你不能改变Perl脚本:通过使用直接调用带参数的命令的Run的多参数变体来删除命令行解释器。

如果你可以更改Perl脚本:像专业人员那样做,并让它从标准输入而不是命令行参数中读取它的输入。

另一个想法是不要将XML与非XML混合使用,这样您就可以使用适当的XML库(如XML::LibXML)来解析输入,这将解决XML内容的任何进一步引用/转义问题。

答案 2 :(得分:0)

阅读task.Run的文档。问题源于那里。你正在寻找一种方式

  • 要么绕过shell
  • 或引用shell的参数。