我XML::Twig用来解析一个非常大的XML文档.我想根据<change></change>标签将其拆分为块.
现在我有:
my $xml = XML::Twig->new(twig_handlers => { 'change' => \&parseChange, });
$xml->parsefile($LOGFILE);
sub parseChange {
my ($xml, $change) = @_;
my $message = $change->first_child('message');
my @lines = $message->children_text('line');
foreach (@lines) {
if ($_ =~ /[^a-zA-Z0-9](?i)bug(?-i)[^a-zA-Z0-9]/) {
print outputData "$_\n";
}
}
outputData->flush();
$change->purge;
}
Run Code Online (Sandbox Code Playgroud)
现在,parseChange当它从XML中提取该块时,它正在运行该方法.它变得非常缓慢.我测试它反对从一个文件中读取XML $/=</change>并编写一个函数来返回XML标记的内容,它的速度要快得多.
有什么东西我缺少或我使用XML::Twig不正确吗?我是Perl的新手.
编辑:以下是更改文件的示例更改.该文件由很多这些文件一个接一个地组成,它们之间不应该有任何东西:
<change>
<project>device_common</project>
<commit_hash>523e077fb8fe899680c33539155d935e0624e40a</commit_hash>
<tree_hash>598e7a1bd070f33b1f1f8c926047edde055094cf</tree_hash>
<parent_hashes>71b1f9be815b72f925e66e866cb7afe9c5cd3239</parent_hashes>
<author_name>Jean-Baptiste Queru</author_name>
<author_e-mail>jbq@google.com</author_e-mail>
<author_date>Fri Apr 22 08:32:04 2011 -0700</author_date>
<commiter_name>Jean-Baptiste Queru</commiter_name>
<commiter_email>jbq@google.com</commiter_email>
<committer_date>Fri Apr 22 08:32:04 2011 …Run Code Online (Sandbox Code Playgroud) 我是XML :: Twig的新手.如何更改所有空元素以使用空元素标记(<foo/>)而不是开始标记和结束标记组合(<foo></foo>)?
输入:
<book>
<given-names>Maurice<xref ref-type="fn" rid="fnI_1"></xref></given-names>
<colspec colname="col1" colnum="1"></colspec>
<entry align="left"><p></p></entry>
</book>
Run Code Online (Sandbox Code Playgroud)
我需要输出为:
<book>
<given-names>Maurice<xref ref-type="fn" rid="fnI_1"/></given-names>
<colspec colname="col1" colnum="1"/>
<entry align="left"><p/></entry>
</book>
Run Code Online (Sandbox Code Playgroud)
我试过了:
use XML::Twig;
my $xml = XML::Twig->new(twig_handlers => {
'xref' => sub {$_->set_tag('#EMPTY'),},
},
pretty_print => 'indented',
);
$xml->parse('sample.xml');
$xml->print;
}
Run Code Online (Sandbox Code Playgroud)
但我无法处理它.如何在没有内容标签的情况下全面改变空标签?我该怎么改变?
我想获取一个特定的字符串,例如来自某个XML的<received> 123 </ received>中的123,这些XML将从URL中检索.
我写了一段代码,但仍然遇到错误信息:
尝试在/usr/share/perl5/XML/Twig.pm第392行加入引用.
我该如何解决?
代码:
use XML::Twig;
use LWP::Simple;
my $url = 'http://192.168.1.205:13000/status.xml';
my $twig = new XML::Twig(TwigRoots => {
'smsc/received' => sub {$author = $_[1]->text; }});
$twig->nparse( $url );
$twig->print;
Run Code Online (Sandbox Code Playgroud) 使用XML::Twig,有没有办法获取节点的整个HTML?我不想要节点的文本,而是整个HTML标签和所有.
输入XML
<content> <p>blah blah <b> bla bla </b> </p>
<p> line 2 <i> test </i? </p>
</content>
Run Code Online (Sandbox Code Playgroud)
码
my $twig = new XML::Twig(
TwigRoots => {'content' => 1},
TwigHandlers => $twig_handlers
);
my $twig_handlers = {'count/p' => \&count_ps};
sub count_ps {
my ($twig, $test) = @_;
$Data .= $test->text();
}
Run Code Online (Sandbox Code Playgroud)
$data 应该告诉我整个HTML.
对于我的生活,我无法理解实体处理的XML :: Twig文档.
我有一些用HTML :: Tidy生成的XML.电话如下:
my $tidy = HTML::Tidy->new({
'indent' => 1,
'break-before-br' => 1,
'output-xhtml' => 0,
'output-xml' => 1,
'char-encoding' => 'raw',
});
$str = "foo bar";
$xml = $tidy->clean("<xml>$str</xml>");
Run Code Online (Sandbox Code Playgroud)
产生:
<html>
<head>
<meta content="tidyp for Linux (v1.02), see www.w3.org" name="generator" />
<title></title>
</head>
<body>foo bar</body>
</html>
Run Code Online (Sandbox Code Playgroud)
XML :: Twig(可以理解)barf .我想做一些转换,通过XML :: Twig运行它:
my $twig = XML::Twig->new(
twig_handlers => {... handlers ...}
);
$twig->parse($xml);
Run Code Online (Sandbox Code Playgroud)
该$twig->parse行barfs的 ,但我无法弄清楚如何添加 元素编程.我尝试过这样的事情:
my …Run Code Online (Sandbox Code Playgroud) 我在XML :: Twig文档中看到,parse($text)解析标量的函数包含xml文本,以及parsefile($fileName)读取和解析xml文件.我想解析输入流(文件句柄或STDIN).仍在涉及文档,没有找到任何东西.我该怎么做?
我有一个XML文档,我需要将其转换为另一种类型的XML.有些信息无法在我想要转换的XML中编码,因此我希望将额外信息存储为注释.但是,我无法弄清楚如何在XML :: Twig中创建注释节点.有谁知道怎么样?
我正在尝试使用XML :: Twig解析一个大的xml文件(大约100,000条记录),但perl解析失败并出现错误:
perl.exe - Application Error:
The instruction at "0x28086920" referenced memory at "0x00000004". The memory could not be "written"...
Run Code Online (Sandbox Code Playgroud)
我读过,XML::Twig解析大型xml文件没有任何问题,但在我的情况下它失败了上述错误.
我的.pl文件有一个forloop代码,可以旋转100,000次,如下所示:
foreach my $d1(@detailData) {
if ($d1->first_child('a')->getElementsByTagName('b')) {
$id= $d1->first_child('a')->first_child('x')->field('b');
}
....
.....
......
}
Run Code Online (Sandbox Code Playgroud)
在forloop里面我有大约20个如果循环如上.它是否导致内存问题?
任何人都可以建议我如何克服这些记忆问题?
在几年前,我发现了一些Perl online,它在单行时整齐地格式化了有效的XML(标签和换行符).代码如下.
它使用XML :: Twig来做到这一点.它创建XML ::嫩枝对象而不 keep_encoding( $twig = XML::Twig->new()),但如果我给它在它的非ASCII字符UTF-8编码的XML文件时,它产生一个文件,该文件是不是有效根据isutf8命令上UTF-8 Ubuntu Linux系统.在xxd中打开文件,我可以看到字符从2字节变为1.
如果我使用我$twig= XML::Twig->new(keep_encoding=>1);的相同输入产生有效的UTF-8并保留两个字节.
根据Perldoc的keep_encoding
这是一个(稍微?)邪恶的选项:如果XML文档不是UTF-8编码并且你想保持这种方式,那么设置keep_encoding将使用Expat original_string方法作为字符,从而保持原始编码,以及字符串中的原始实体.
为什么在没有该选项的情况下生成非UTF-8文档,为什么设置它会导致保留UTF-8-ness?
顺便说一下,非ASCII字符是一个不间断的空格(c2 a0).
use strict;
use warnings;
use XML::Twig;
my $sXML = join "", (<>);
my $params = [qw(none nsgmls nice indented record record_c)];
my $sPrettyFormat = $params->[3] || 'none';
my $twig = XML::Twig->new();
$twig->set_indent(" "x4);
$twig->parse( $sXML );
$twig->set_pretty_print( $sPrettyFormat );
$sXML = $twig->sprint;
print $xXML;
Run Code Online (Sandbox Code Playgroud) 我尝试为每个标记调用子例程,但从end_tag_handlers不调用它.
我的目标是这个序列:
--- ---序列
时<auto>调用\&loading.
当<apps><title>通话\&kicks.
当<apps><logs>通话\&bye.
当<apps>通话\&app.
当<apps><title>通话\&kicks.
当<apps><logs>通话\&bye.
当<apps>通话\&app.
当</auto>通话\&finish.→ 没有打电话.
temp.pl:
#!/usr/local/bin/perl -w
use XML::Twig;
my $twig = XML::Twig->new(
start_tag_handlers =>
{ 'auto' => \&loading
},
twig_handlers =>
{ 'apps/title' => \&kicks,
'apps/logs' => \&bye
},
twig_roots =>
{ 'apps' => \&app
}, …Run Code Online (Sandbox Code Playgroud) perl ×10
xml-twig ×10
xml ×7
inputstream ×1
large-files ×1
parsing ×1
tags ×1
utf-8 ×1
xml-entities ×1