2012-02-27 3 views
1

Я новичок Perl, пытающийся прочитать SGML-файл, проанализирую его, затем преобразую его в XML, чтобы я мог получить пары ключ/значение всех элементов. Я нашел модули SGML::DTDParse и XML::Simple, так как я думаю, что это то, что я хочу для задачи. Моя проблема заключается в том, что я не могу найти документацию по DTDParse или любым примерам кода.Правильный синтаксис для синтаксического анализа SGML-файла с использованием Perl?

Мой код ниже:

# 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 = SGML::DTDParse::DTD->new(); 
$dtd->parse($file); 
print $dtd; 

Я не верю, разобранный файл можно рассматривать как XML, хотя, так что, возможно, правильный путь, чтобы получить все элементы из проанализированного файла являются циклами for.

ответ

2

Нет функции dtdParse.

dtdparse - это программа, которая поставляется с модулем SGML :: DTDParse.

Вы можете использовать его для удаления xml из файла dtd. Быстрый пример, как можно использовать dtdparse:

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); 

где test.dtd выглядит следующим образом:

<?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

Тогда вы не добавили каталог 'dtdparse' в свой' $ PATH'. – reinierpost

+0

Возможно, вы все равно не захотите его использовать, если только вы не пытаетесь разобрать DTD. – reinierpost

2

dtdparse не функция Perl; это скрипт для обработки SGML DTD из командной строки. Документация для скрипта: here.

Поскольку вы хотите выполнить разбор в своем собственном скрипте Perl, вы можете использовать the source из dtdparse в качестве примера, если хотите.

2

Для SGML используйте James Clark's SP, который включает в себя SGML to XML converter called SX. Это профессиональная система, и у нее есть документация. Если вам нужен Perl, используйте system или open для вызова SP/SX в качестве внешней программы.

Смежные вопросы