Как построить дерево XML, используя парсеры на основе событий в Perl для больших данных? - PullRequest
2 голосов
/ 19 мая 2011

У меня есть XML-файл, подобный следующему:

    <Nodes><Node>
 <NodeName>Company</NodeName>
 <File>employee_details.csv</File>
 <data>employee_data.txt</data>
<Node>
     <NodeName>dummy</NodeName>
     <File>employee_details1.csv</File>
     <data>employee_data1.txt</data>
    </Node>
    </Node>
</Nodes>

    #Contents of employee_data.txt
Empname,Empcode,EmpSal:Currency,Empaddr
#Contents of employee_details.csv (like this huge data)
Alex,A001,1000:USD,Bangalore
Aparna,B001,1000:RUBEL,Bombay
#Contents of employee_data1.txt
phone,fax
#Contents of employee_details1.csv (like this huge data)
44568889,123345656
23232323,454545757

Вывод:

<Company>
<Empname>Alex</Empname>
<Empcode>A001</Empcode>
<EmpSal=USD>1000</EmpSal>
<Empaddr>Bangalore</Empaddr>
<phone>44568889</phone>
<fax>123345656</fax>
</Company>
<Company>
<Empname>Aparna</Empname>
<Empcode>B001</Empcode>
<EmpSal=RUBEL>1000</EmpSal>
<Empaddr>Bombay</Empaddr>
<phone>23232323</phone>
<fax>454545757</fax>

Я хочу построить дерево XML с помощью синтаксического анализатора Sax, но не могу понять, какПройдите через все узлы и создайте событие.

Я должен получить приведенный выше вывод?

Как я могу сделать это в Perl?

Ответы [ 3 ]

2 голосов
/ 20 мая 2011

.pl файл мой $ factory = XML :: SAX :: ParserFactory-> new (); мой $ parser = $ factory-> parser (Handler => sax_handler-> new (arguments_to parse));

sax_handler.pm су новый () { // ничего как такового! my ($ type); вернуть благослови {}, $ тип; } // следующие 2 метода важны sub start_element { my ($ self, $ element) = @_;

#attributes of comment tag...m:text is tag
if( $element->{Name} eq "m:text")
{
$name=$element->{Attributes}->{'{}name'}->{'Value'};
}

}

// m: reviewID - это тег в вашем XML! sub end_element { my ($ self, $ element) = @_;

#write down all tags...& print them or manipulate them
if( $element->{Name} eq "m:reviewID"){

} }

1 голос
/ 20 мая 2011

Ну и SAX Parser немного отличается от других техник разбора. Здесь вам нужно написать свой обработчик [модуль perl]. Модуль должен содержать следующие вещи -> 1. Конструктор. 2. подпрограмма start_element 3.end_element. Вы можете управлять событиями внутри подпрограмм, например: [for tag] -> if ($ element -> {Name} eq "mail_id") { $ User_mail_id = $ self-> get_text ();}

1 голос
/ 19 мая 2011

Мне кажется, что файлы CSV могут быть огромными, а не XML. Так что на самом деле нет необходимости использовать SAX-парсер. XML используется только для определения местоположения 4 файлов. 2 из этих файлов (.txt) маленькие, они содержат только список полей, а последние 2 файла могут быть большими. Это файл CSV.

Вы должны использовать Text :: CSV_XS , чтобы проанализировать эти 2 огромных файла. Затем вы можете вывести XML, используя обычную печать (просто убедитесь, что вы экранировали текст и обратите внимание на кодировку (кстати, в вашем примере вывода <EmpSal=USD> не является правильно сформированным XML, значение атрибута должно быть заключено в кавычки: <EmpSal="USD"> Другой вариант - XML :: Writer , который позаботится о экранировании и цитировании для вас. Я не думаю, что генерация событий SAX и передача их писателю SAX имеет смысл в этом случае, это будет более сложным и, вероятно, медленнее, чем другие варианты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...