0

XML::Tidyファイルをインデントするために other で使用しようとしていXMLます:

sub reformatXML {
    #
    # the only argument to this function is the file name
    #
    my $file = $_[ 0 ];
    #
    # create a new XML::Tidy object from $file
    #
    my $tidy = XML::Tidy->new( 'filename' => $file );
    #
    # Tidy up the indenting
    #
    $tidy->tidy();
    #
    # write out changes back to the file
    #
    $tidy->write();
    print "$file was reformated.\n";
    return
}

sub main(){
    #
    # get the current directory in which is the 
    # program running on
    #
    #my $current_dir = getcwd;
    #iterateDir( $current_dir );
    my $file = "/path/to/xml/file/autotest.xml";
    reformatXML( $file );
}

それと同じくらい簡単です。ただし、main()関数を呼び出すと、次のようになります。

501 Protocol scheme 'd' is not supported d:/UDU/r/tc10.0.0.2012080100_buildA/src/build/kits/tc.dtd
Handler couldn't resolve external entity at line 2, column 29, byte 73
error in processing external entity reference at line 2, column 29, byte 73:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE kit SYSTEM "tc.dtd">
============================^
<kit>
  <contact/>
 at C:/xampp/perl/site/lib/XML/Parser.pm line 187

私は初めてでPerl、なぜそのエラーなのかわかりません。誰かがそれを理解するのを手伝ってくれませんか?

XMLファイルの先頭は次のとおりです。

 <?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE kit SYSTEM "tc.dtd">
<kit>
  <contact/>
  <description>autotest files</description>
  <history>
    <hist>06-May-2005                  Created</hist>
    <hist>17-Jun-2005            Add autotest.jar to rtkit</hist>
    <hist>29-Jun-2005            Remove bits picked up elsewhere</
hist>
    <hist>15-Jul-2005            Added acad_add_note_types.</hist>
    <hist>20-Sep-2005            Add ai stuff</hist>
    <hist>31-Oct-2005            DMS BnT fixes</hist>
    <hist>03-Nov-2005            Pander to kitting's obsession abo
ut unique filenames</hist>
    <hist>17-Nov-2005            Add ics schema and junit</hist>
    <hist>09-Dec-2005            add gdt_autotest</hist>
    <hist>11-Jan-2006            Merge in P10.0.1.5</hist>
    <hist>16-Jan-2006      Merge</hist>
    <hist>26-Jan-2006      Need inclass.plmxml to pass tceng
_util autotest</hist>
    <hist>06-Mar-2006      Add qdiff.pl</hist>
    <hist>09-Mar-2006      Kernel tests need a couple fms cl
ient files</hist>
    <hist>10-Mar-2006      Missing dependent library</hist>
    <hist>19-Jan-2006      Merged from timb_gmo</hist>
    <hist>17-Jan-2006      GMO Kernel Autotests Implementati

4

1 に答える 1

2

XML::Tidy (または、それが使用するモジュールの 1 つ) は、ファイルへの絶対パスが有効な URL であることを期待しているように見えますが、そうではありません。指定されたURLは

 d:/UDU/r/tc10.0.0.2012080100_buildA/src/build/kits/tc.dtd

それが本当のとき

 file:///d:/UDU/r/tc10.0.0.2012080100_buildA/src/build/kits/tc.dtd

そのバグを回避する方法がわかりません。変更してみることができます

my $file = "...";
reformatXML($file);

my $file = "...";
my $url = URI::file->new($file);
reformatXML($url);

それが直接のバグです。さらに、相対 URL が DTD に提供されるという問題があります。それは必ずしも間違っているわけではありませんが、少し奇妙です。tc.dtdが と同じディレクトリに存在する必要があることを意味しautotest.xmlます。本当にそうですか?


一部のパーサー (XML::LibXML など) には、DTD のフェッチを回避するオプションがあります。通常は不要であり、時間、お金、CPU、および帯域幅の無駄です。そのようなオプションを探してください。それはおそらく、XML::Tidy によって継承されたクラスの 1 つのコンストラクターにあります。

于 2012-08-23T18:08:47.620 に答える