2

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*>
    ^
4

2 に答える 2

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/>
于 2012-10-10T15:50:36.283 に答える
1

*仕様ではそのような文字を要素名に表示することが許可されていないため、は要素名の有効な文字ではありません。NameCharを参照してください。

于 2012-10-10T13:12:29.133 に答える