XML :: LibXML可以解析古怪的标签吗?

时间:2012-10-10 13:05:41

标签: perl xml-libxml

是否可以让XML::LibXML解析下面示例中显示的节点?我意识到我可能通过将'*'指定为节点名称的一部分来创建无效的XML,如果有人可以解释它为什么无效,我会很感激:

use strict;
use warnings;
use XML::LibXML;

my $doc = XML::LibXML->createDocument;

my $quirky = XML::LibXML::Element->new( 'YAK*' );
$quirky->appendText( 'Important Data' );

$doc->setDocumentElement( $quirky );

print $doc->toString;  # <?xml version="1.0"?>
                       # <YAK*>Important Data</YAK*>

my $data = XML::LibXML
           ->new
             ->parse_string( $doc->toString );

输出:

<?xml version="1.0"?>
<YAK*>Important Data</YAK*>
:2: parser error : error parsing attribute name
<YAK*>Important Data</YAK*>
    ^
:2: parser error : attributes construct error
<YAK*>Important Data</YAK*>
    ^
:2: parser error : Couldn't find end of Start Tag YAK line 2
<YAK*>Important Data</YAK*>
    ^
:2: parser error : Extra content at the end of the document
<YAK*>Important Data</YAK*>
    ^

2 个答案:

答案 0 :(得分:2)

如果您打开recover选项 -

,它将尝试工作
my $parser = XML::LibXML->new;
$parser->recover_silently(1);
my $doc2 = $parser->parse_string( $doc->toString );
print $doc2->toString;

但是,如你所见,虽然它可以解析一个无效的文件但它不能/不会往返一个 -

<?xml version="1.0"?>
<YAK/>

答案 1 :(得分:1)

*不是元素名称中的有效字符,因为规范不允许此类字符出现在元素名称中。请参阅NameChar