标签: xml-twig

我怎样才能加速XML :: Twig

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 perl parsing large-files xml-twig

5
推荐指数
1
解决办法
1084
查看次数

如何更改XML以使用空元素标签?

我是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 tags perl xml-twig

5
推荐指数
2
解决办法
1045
查看次数

如何使用XML :: Twig从URL中提取一些XML数据?

我想获取一个特定的字符串,例如来自某个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 perl xml-twig

4
推荐指数
1
解决办法
1254
查看次数

如何获取包含元素标记的XML节点的整个内部内容?

使用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.

perl xml-twig

4
推荐指数
1
解决办法
271
查看次数

如何通过编程方式通过XML :: Twig添加实体声明?

对于我的生活,我无法理解实体处理的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 &nbsp; 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 &nbsp; bar</body>
</html>
Run Code Online (Sandbox Code Playgroud)

XML :: Twig(可以理解)barf &nbsp;.我想做一些转换,通过XML :: Twig运行它:

my $twig = XML::Twig->new(
  twig_handlers => {... handlers ...}
);

$twig->parse($xml);
Run Code Online (Sandbox Code Playgroud)

$twig->parse行barfs的&nbsp;,但我无法弄清楚如何添加&nbsp;元素编程.我尝试过这样的事情:

my …
Run Code Online (Sandbox Code Playgroud)

xml perl xml-twig xml-entities

4
推荐指数
1
解决办法
924
查看次数

使用XML :: Twig解析文件句柄

我在XML :: Twig文档中看到,parse($text)解析标量的函数包含xml文本,以及parsefile($fileName)读取和解析xml文件.我想解析输入流(文件句柄或STDIN).仍在涉及文档,没有找到任何东西.我该怎么做?

xml perl inputstream xml-twig

4
推荐指数
1
解决办法
463
查看次数

XML :: Twig评论

我有一个XML文档,我需要将其转换为另一种类型的XML.有些信息无法在我想要转换的XML中编码,因此我希望将额外信息存储为注释.但是,我无法弄清楚如何在XML :: Twig中创建注释节点.有谁知道怎么样?

xml perl xml-twig

4
推荐指数
1
解决办法
866
查看次数

使用XML :: TWIG进行大型xml文件解析失败

我正在尝试使用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 xml-twig

4
推荐指数
1
解决办法
613
查看次数

XML :: Twig keep_encoding如何工作?

在几年前,我发现了一些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)

perl utf-8 xml-twig

4
推荐指数
1
解决办法
645
查看次数

为什么XML :: Twig不调用我的end_tag_handler?

我尝试为每个标记调用子例程,但从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)

xml perl xml-twig

3
推荐指数
1
解决办法
243
查看次数

标签 统计

perl ×10

xml-twig ×10

xml ×7

inputstream ×1

large-files ×1

parsing ×1

tags ×1

utf-8 ×1

xml-entities ×1