Tee上的XML::Twig的错误输出
我正在尝试将一个xml文件拆分为多个格式良好的片段,并在xml::Twig的帮助下完成了我所需要的工作,该Twig吐入一个T形三通。。。至少使用简单的数据输入 如果我将节点重新组合以过滤到父节点,从而使数据结构稍微复杂一点,则第二个文件的格式不正确:父节点缺少其开始标记。我很难找到原因 SSCCE(与初始示例的区别在于包含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 我还注意到,如果我在数据中注释掉标记,则与开头标记对应的注释也
的
):
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',
);