使用perl删除xml声明的通用解决方案

时间:2015-05-12 08:04:04

标签: regex xml perl parsing xmlreader

您好我想删除我的xml文件中的声明,问题是声明有时嵌入了根元素。

XML如下所示

情况1:

<?xml version="1.0" encoding="UTF-8"?> <document> This is a document root
<child>----</child>
</document>`

案例2:

<?xml version="1.0" encoding="UTF-8"?> 
<document> This is a document root
<child>----</child>
</document>`

当根节点位于下一行时,函数也应该适用。

我的功能仅适用于案例2 ..

sub getXMLData {
  my ($xml) = @_;
  my @data = ();
  open(FILE,"<$xml");
  while(<FILE>) {
    chomp;
    if(/\<\?xml\sversion/) {next;}
    push(@data, $_);    
  }
  close(FILE);
  return join("\n",@data);

}

***请注意,编码并非始终保持不变。

1 个答案:

答案 0 :(得分:3)

好的,所以这里的问题是 - 你正在尝试解析基于XML的行,并且那不起作用。你应该避免这样做,因为它会产生脆弱的代码,有一天会破坏 - 正如你所指出的那样 - 得益于对源XML的完全有效的改变。你的文档在语义上都是相同的,所以你的代码处理一个而不是另一个的事实就是为什么用这种方式做XML的一个例子是一个坏主意。

更重要的是 - 为什么要尝试从XML中删除XML声明?你想要完成什么?

通常可以像这样重新格式化XML:

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

my $twig = XML::Twig->new(
    pretty_print  => 'indented',
);
$twig->parsefile('your_xml_file');
$twig->print;

这将解析您的XML并将其重新格式化为一个格式化XML的有效方式。但是我强烈建议你不要丢弃你的XML声明,而是继续使用XML::Twig来处理它。 (用你想要完成的东西打开一个新问题,我很乐意为你提供一个解决方案,它不会使用不同的有效格式的XML)。

在合并XML文档时,XML::Twig也可以这样做 - 并且仍然会检查并验证XML。

所以你可以做一些事情(从上面扩展):

foreach my $file ( @file_list ) {
  my $child = XML::Twig -> new (); 
  $child -> parsefile ( $xml_file );

  my $child_doc = $child -> root -> cut;
  $child_doc -> paste ( $twig -> root );
}

$twig -> print;

你需要做什么,取决于你想要的输出结构 - 无论如何你需要在“根元素”中“包装”。用一些样本输入和所需的输出打开一个新问题,我很乐意对它进行修改。

例如 - 如果您将上面的示例输入提供两次,则会得到:

<?xml version="1.0" encoding="UTF-8"?>
<document><document> This is a document root
<child>----</child></document> This is a document root
<child>----</child></document>

我所知道的不太可能是您想要的,但希望能够说明基于解析器的XML重组方式。