【问题标题】:How to read root tag and root closing tag to a Perl variable?如何将根标记和根结束标记读取到 Perl 变量?
【发布时间】:2013-11-05 06:55:44
【问题描述】:

我是 Perl 的新手。我想将 xml 根标记和根结束标记读取到 perl 变量。

我尝试了这种正常的文件读取。有效。我得到拳头线和最后一行。但有时如果没有新线,你就不能相信拳头线。使用正则表达式读取第一行就完成了。

但我用谷歌搜索了一些内置的 Perl xml 函数来完成这项工作。我没有找到任何东西,即所有对我来说都是新的。

请告诉我哪个库最适合这个。如果可能的话,举个例子。

例如:-

<nst:root arg='1' arg2='2' arg3='3'>
   <a>1</a>
   <b>2</b>
</nst:root>

我想要 2 个变量,例如,

$root = '<nst:root arg='1' arg2='2' arg3='3'>';
$rootClose = '</nst:root>';

我想用其他 xml 替换这个根标签。请帮忙。

这就是我想做的。我有一个 xml 文件,它有实际的根标签。我使用XML::Twig::xml_split 将该文件拆分为多个。我得到很多文件,但标题不同。我想用主文件中的实际标题更新子文件

EG:-

拆分限制为 2

实际文件是,

<nst:root arg='1' arg2='2' arg3='3'>
       <a>1</a>
       <a>1</a>
       <a>1</a>
       <a>1</a>
       <a>1</a>
       <a>1</a>
</nst:root>

它将拆分为 3 个带有 XML::Twig::xml_split 的文件。并且插件添加了自己的标题。

File1:-
<xml_split:root xmlns:xml_split="http://xmltwig.com/xml_split">
           <a>1</a>
           <a>1</a>
</xml_split:root>

File2:-
<xml_split:root xmlns:xml_split="http://xmltwig.com/xml_split">
           <a>1</a>
           <a>1</a>
</xml_split:root>

File3:-
<xml_split:root xmlns:xml_split="http://xmltwig.com/xml_split">
           <a>1</a>
           <a>1</a>
</xml_split:root>

我想要它

File1:-
<nst:root arg='1' arg2='2' arg3='3'>
           <a>1</a>
           <a>1</a>
</nst:root>

File2:-
<nst:root arg='1' arg2='2' arg3='3'>
           <a>1</a>
           <a>1</a>
</nst:root>

File3:-
<nst:root arg='1' arg2='2' arg3='3'>
           <a>1</a>
           <a>1</a>
</nst:root>

【问题讨论】:

  • @mirod 你能帮我吗?
  • 为什么要将开始标签放在一个变量中,而将结束标签放在另一个变量中?该命名空间在哪里声明?
  • 看看这就是我想做的。我有一个 xml 文件,它有实际的根标签。我使用XML::Twig::xml_split 将该文件拆分为多个。我得到很多文件,但标题不同。我想用主文件中的实际标题更新子文件。

标签: xml perl


【解决方案1】:

我不知道如何使用xml_split 程序,但这里有一个使用XML::Twig 模块的方法,我在其中创建新元素并将每对子元素从一棵树移动到另一棵树:

#!/usr/bin/env perl

use strict;
use warnings;
use XML::Twig;
use POSIX qw<ceil>;

my ($split_limit, $n) = (2, 0); 

my $twig = XML::Twig->new->parsefile( shift );
my $root = $twig->root;

for (  1 .. ceil( $root->children_count / $split_limit ) ) { 
    my $t = XML::Twig::Elt->new( $root->tag, $root->atts );
    for ( 1 .. $split_limit ) { 
        my $children = $root->first_child;
        last unless $children;
        $children->move( last_child => $t );
    }   
    $t->print_to_file( 'xmlfile-' . $n++ . '.xml' );
}

像这样运行它:

perl script.pl xmlfile

这会为根的每一对子节点及其标题生成一个文件:

==> xmlfile-0.xml <==
<nst:root arg="1" arg2="2" arg3="3"><a>1</a><a>1</a></nst:root>
==> xmlfile-1.xml <==
<nst:root arg="1" arg2="2" arg3="3"><a>1</a><a>1</a></nst:root>
==> xmlfile-2.xml <==
<nst:root arg="1" arg2="2" arg3="3"><a>1</a><a>1</a></nst:root>

【讨论】:

  • 我希望将子 xml 文件头替换为原始文件。不是子元素标题
  • @Sahal:我不明白你的意思。根据您的输入提供示例输出数据。
  • 请查看示例部分
  • 谢谢,很有帮助。最后的帮助。我在原始文件中有 9 条记录。它创建了 4 个文件(split_limit = 2)并忽略了最后一条记录。它应该创建 5 个文件,最后一个应该有一个记录。需要理解代码。对你来说这很容易
  • 真棒.. 工作就像一个魅力.. 非常感谢你。你让我开心。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 2017-02-03
  • 1970-01-01
相关资源
最近更新 更多