Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tee上的XML::Twig的错误输出_Xml_Perl_Xml Parsing_Xml Twig - Fatal编程技术网

Tee上的XML::Twig的错误输出

Tee上的XML::Twig的错误输出,xml,perl,xml-parsing,xml-twig,Xml,Perl,Xml Parsing,Xml Twig,我正在尝试将一个xml文件拆分为多个格式良好的片段,并在xml::Twig的帮助下完成了我所需要的工作,该Twig吐入一个T形三通。。。至少使用简单的数据输入 如果我将节点重新组合以过滤到父节点,从而使数据结构稍微复杂一点,则第二个文件的格式不正确:父节点缺少其开始标记。我很难找到原因 SSCCE(与初始示例的区别在于包含的): veg.xml缺少 1. 2. 3. 我是胡萝卜! 我是个土豆! 我是个泡菜! 我是茄子! A. B 我还注意到,如果我在数据中注释掉标记,则与开头标记对应的注释也

我正在尝试将一个xml文件拆分为多个格式良好的片段,并在xml::Twig的帮助下完成了我所需要的工作,该Twig吐入一个T形三通。。。至少使用简单的数据输入

如果我将节点重新组合以过滤到父节点,从而使数据结构稍微复杂一点,则第二个文件的格式不正确:父节点缺少其开始标记。我很难找到原因

SSCCE(与初始示例的区别在于包含
):

veg.xml
缺少


1.
2.
3.
我是胡萝卜!
我是个土豆!
我是个泡菜!
我是茄子!
A.
B
我还注意到,如果我在数据中注释掉
标记,则与开头标记对应的注释也会从
veg.xml
中丢失,而不是从
fruit.xml
中丢失

我似乎理解第一条注释是在处理第一条
时出现的,第二条注释应该在处理文件的其余部分时从
\u default\u
处理程序中处理。但是我不明白当
没有被注释时,它是否是相同的


WFIW,我在Windows7上使用了草莓的Perl5.20.1

哦,哇,我很惊讶它能这么好地工作

第一次到达
$thing->flush($frufile)时,它会打印之前尚未刷新的所有内容。如果不是您先前尝试修复此问题,它将具有以下输出:

<batch>
  <header>
    <foo>1</foo>
    <bar>2</bar>
    <baz>3</baz>
  </header>
  <thing_list>
    <thing type="fruit">Im an apple!</thing>

使用风险自负:)

可在Linux@ikegami你的意思是“不能复制”?不,没有打字错误。我写下了我的意思。@ikegami感谢您抽出时间进行测试。所以它要么是坏的,要么更可能是我误解了XML::twigs的用法,所以需要修复的是我对XML::Twig的理解。
是否应该以第一个
作为其父级?如果是这样的话,我不明白为什么对
magic
处理程序的所有调用都不是这样。不,您的程序需要修复。不要混合和匹配输出句柄。如果需要生成两个文件,请运行模板两次。哦,太糟糕了。我的实际情况是将一个文件分成“较小”的块(30..200MB),这个文件可能很大,因此我发现,使用T在多个文件中同时输出页眉和页脚部分,并使用处理程序分派其余部分是一个聪明的解决方案,因为不必多次读取该文件。我可能会尝试基于SAX的解析。@Seki,更新了我的答案。谢谢你的更新。现在它非常接近我想要得到的,但它产生的是稀疏文件:有一些空行,只有与丢弃的项目对应的缩进,即使使用
pretty\u print=>“none”
<batch>
  <header>
    <foo>1</foo>
    <bar>2</bar>
    <baz>3</baz>
  </header>
  <thing_list>
    <thing type="fruit">Im an apple!</thing>
    <thing type="fruit">Im a pear!</thing>
    <thing type="fruit">Im a banana!</thing>
  </thing_list>
  <trailer>
    <chrzaszcz>A</chrzaszcz>
    <zdzblo>B</zdzblo>
  </trailer>
</batch>
<batch>
  <header>
    <foo>1</foo>
    <bar>2</bar>
    <baz>3</baz>
  </header>
    <thing type="vegetable">Im a carrot!</thing>
    <thing type="vegetable">Im a potato!</thing>
    <thing type="vegetable">Im a pickle!</thing>
    <thing type="vegetable">Im an eggplant!</thing>
  </thing_list>
  <trailer>
    <chrzaszcz>A</chrzaszcz>
    <zdzblo>B</zdzblo>
  </trailer>
</batch>
<batch>
  <header>
    <foo>1</foo>
    <bar>2</bar>
    <baz>3</baz>
  </header>
  <thing_list>
    <thing type="fruit">Im an apple!</thing>
  <thing_list>
    <thing type="fruit">Im an apple!</thing>
my $twig = XML::Twig->new(
    twig_roots => {
        'thing_list/thing' => sub {
            my ($t, $element) = @_;
            for ($element->{att}{type}) {
                if (/fruit/) {
                    $t->flush($frufile);
                } elsif (/vegetable/) {
                    $t->flush($vegfile);
                } else {
                    $t->purge;
                }
            }
        },
    },
    twig_print_outside_roots => 1,
    pretty_print => 'indented',
    empty_tags => 'normal',
);