2012-02-27 5 views
1

私はSGMLファイルを読み込み、それを解析してXMLに変換しようとするPerl初心者です。そのため、すべての要素のキーと値のペアを取得できます。私はSGML::DTDParseXML::Simpleのモジュールを見つけました。私はこれが私の仕事のために望んでいると思います。私の問題は、私はDTDParseまたは任意のコード例に関するドキュメントを見つけることができないということです。Perlを使用してSGML to XMLファイルを解析するための正しい構文はありますか?

私のコードは以下の通りです:

# use modules 
use SGML::DTDParse; 
use XML::Simple; 
use Data::Dumper; 

use warnings; 
use strict; 

my $xml; 
my $data; 
my $convert; 

$/ = undef; 
open FILE, "C:/..." or die $!; 
my $file = <FILE>; 

# Convert the DTD file to XML 
dtdParse $file; 

# Create the XML object 
$xml = new XML::Simple; 

# Read the XML file 
$data = $xml->XMLin($file); 

# print the output 
print Dumper($data); 

次のように私はdtdParse $ファイルの行でエラーが出ます:「私のスクリプト名」

でパッケージまたはオブジェクト参照なし「dtdParse」メソッドを呼び出すことはできません

ここで正しい構文について考えてください。これはタスクにとって有効なアプローチですか?

私は再びコードにコードを再加工し、これを解析するDTDを行うことができました:

$dtd = SGML::DTDParse::DTD->new(); 
$dtd->parse($file); 
print $dtd; 

私が解析されたファイルはいえ、XML考えることができると信じていない、ので、多分正しい方法を取得します解析されたファイルのすべての要素はforループです。

答えて

2

機能dtdParseはありません。

dtdparseは、SGML :: DTDParseモジュールに付属するプログラムです。

xmlをdtdファイルからダンプするために使用できます。 あなたはdtdparse使用することができますどのように簡単な例:

<?xml version="1.0" encoding="UTF-8"?> 
<!ELEMENT DatabaseInventory (DatabaseName+)> 
<!ELEMENT DatabaseName ( GlobalDatabaseName 
         , OracleSID 
         , DatabaseDomain 
         , Administrator+ 
         , DatabaseAttributes 
         , Comments) 
> 
<!ELEMENT GlobalDatabaseName (#PCDATA)> 
<!ELEMENT OracleSID   (#PCDATA)> 
<!ELEMENT DatabaseDomain  (#PCDATA)> 
<!ELEMENT Administrator  (#PCDATA)> 
<!ELEMENT DatabaseAttributes EMPTY> 
<!ELEMENT Comments   (#PCDATA)> 

<!ATTLIST Administrator  EmailAlias CDATA #REQUIRED> 
<!ATTLIST Administrator  Extension CDATA #IMPLIED> 
<!ATTLIST DatabaseAttributes Type  (Production|Development|Testing) #REQUIRED> 
<!ATTLIST DatabaseAttributes Version (7|8|8i|9i) "9i"> 

<!ENTITY AUTHOR "Jeffrey Hunter"> 
<!ENTITY WEB "www.iDevelopment.info"> 
<!ENTITY EMAIL "[email protected]"> 

出力のようなものだろうどの:

$VAR1 = { 
    'namecase-entity' => '0', 
    'created-by' => 'DTDParse V2.00', 
    'public-id' => '', 
    'version' => '1.0', 
    'attlist' => { 
    'DatabaseAttributes' => { 
     'attribute' => { 
     'Type' => { 
      'value' => 'Production Development Testing', 
      'type' => '#REQUIRED', 
      'default' => '', 
      'enumeration' => 'yes' 
     }, 
     'Version' => { 
      'value' => '7 8 8i 9i', 
      'type' => '', 
      'default' => '9i', 
      'enumeration' => 'yes' 
     } 
     }, 
     'attdecl' => ' Type  (Production|Development|Testing) #REQUIRED' 
    }, 
    'Administrator' => { 
     'attribute' => { 
     'EmailAlias' => { 
      'value' => 'CDATA', 
      'type' => '#REQUIRED', 
      'default' => '' 
     }, 
     'Extension' => { 
      'value' => 'CDATA', 
      'type' => '#IMPLIED', 
      'default' => '' 
     } 
     }, 
     'attdecl' => '  EmailAlias CDATA #REQUIRED' 
    } 
    }, 
    'element' => { 
    'OracleSID' => { 
     'content-type' => 'mixed', 
     'content-model-expanded' => { 
     'sequence-group' => { 
      'pcdata' => {} 
     } 
     }, 
     'content-model' => { 
     'sequence-group' => { 
      'pcdata' => {} 
     } 
     } 
    }, 
    'Comments' => { 
     'content-type' => 'mixed', 
     'content-model-expanded' => { 
     'sequence-group' => { 
      'pcdata' => {} 
     } 
     }, 
     'content-model' => { 
     'sequence-group' => { 
      'pcdata' => {} 
     } 
     } 
    }, 
    'DatabaseAttributes' => { 
     'content-type' => 'element', 
     'content-model-expanded' => { 
     'empty' => {} 
     }, 
     'content-model' => { 
     'empty' => {} 
     } 
    }, 
    'GlobalDatabaseName' => { 
     'content-type' => 'mixed', 
     'content-model-expanded' => { 
     'sequence-group' => { 
      'pcdata' => {} 
     } 
     }, 
     'content-model' => { 
     'sequence-group' => { 
      'pcdata' => {} 
     } 
     } 
    }, 
    'Administrator' => { 
     'content-type' => 'mixed', 
     'content-model-expanded' => { 
     'sequence-group' => { 
      'pcdata' => {} 
     } 
     }, 
     'content-model' => { 
     'sequence-group' => { 
      'pcdata' => {} 
     } 
     } 
    }, 
    'DatabaseInventory' => { 
     'content-type' => 'element', 
     'content-model-expanded' => { 
     'sequence-group' => { 
      'element-name' => { 
      'occurrence' => '+', 
      'name' => 'DatabaseName' 
      } 
     } 
     }, 
     'content-model' => { 
     'sequence-group' => { 
      'element-name' => { 
      'occurrence' => '+', 
      'name' => 'DatabaseName' 
      } 
     } 
     } 
    }, 
    'DatabaseDomain' => { 
     'content-type' => 'mixed', 
     'content-model-expanded' => { 
     'sequence-group' => { 
      'pcdata' => {} 
     } 
     }, 
     'content-model' => { 
     'sequence-group' => { 
      'pcdata' => {} 
     } 
     } 
    }, 
    'DatabaseName' => { 
     'content-type' => 'element', 
     'content-model-expanded' => { 
     'sequence-group' => { 
      'element-name' => { 
      'Comments' => {}, 
      'OracleSID' => {}, 
      'DatabaseAttributes' => {}, 
      'DatabaseDomain' => {}, 
      'GlobalDatabaseName' => {}, 
      'Administrator' => { 
       'occurrence' => '+' 
      } 
      } 
     } 
     }, 
     'content-model' => { 
     'sequence-group' => { 
      'element-name' => { 
      'Comments' => {}, 
      'OracleSID' => {}, 
      'DatabaseAttributes' => {}, 
      'DatabaseDomain' => {}, 
      'GlobalDatabaseName' => {}, 
      'Administrator' => { 
       'occurrence' => '+' 
      } 
      } 
     } 
     } 
    } 
    }, 
    'entity' => { 
    'WEB' => { 
     'text-expanded' => 'www.iDevelopment.info', 
     'text' => 'www.iDevelopment.info', 
     'type' => 'gen' 
    }, 
    'AUTHOR' => { 
     'text-expanded' => 'Jeffrey Hunter', 
     'text' => 'Jeffrey Hunter', 
     'type' => 'gen' 
    }, 
    'EMAIL' => { 
     'text-expanded' => '[email protected]', 
     'text' => '[email protected]', 
     'type' => 'gen' 
    } 
    }, 
    'system-id' => 'test.dtd', 
    'unexpanded' => '1', 
    'created-on' => 'Tue Feb 28 00:44:52 2012', 
    'declaration' => '', 
    'xml' => '0', 
    'title' => '?untitled?', 
    'namecase-general' => '1' 
}; 
+0

ここでdtdparseの使い方がわかりません。私はどこに宣言されているか分かりませんし、このエラーが発生します。「コードをステップ実行すると、「 'dtdparse'は内部または外部のコマンド、実行可能なプログラムまたはバッチファイルとして認識されません。 –

+0

それから、 '$ PATH'に' dtdparse'のディレクトリを追加していません。 – reinierpost

+0

本当にDTDを解析しようとしているのでなければ、とにかくそれを使いたくないでしょう。 – reinierpost

2

dtdparseではないtest.dtdはこのようになります

use strict; 
use warnings; 

use SGML::DTDParse; 
use XML::Simple; 
use Data::Dumper; 

# Convert the DTD file to XML 
my $result = qx{dtdparse test.dtd}; 

# Create the XML object 
my $xml = new XML::Simple; 

# Read the XML file 
$result = $xml->XMLin($result); 

# print the output 
$Data::Dumper::Indent = 1; 
print Dumper($result); 

Perl関数。コマンドラインからSGML DTDを処理するためのスクリプトです。スクリプトのドキュメントはhereです。

独自のPerlスクリプトで解析したいので、好きな場合は、dtdparsethe sourceを例として使用できます。

2

SGMLの場合、SGML to XML converter called SXを含むJames Clark's SPを使用してください。これは専門的なシステムであり、ドキュメントを持っています。そこにPerlが必要な場合は、systemまたはopenを使用して、外部プログラムとしてSP/SXを呼び出します。