Как создать XML с помощью XML :: Twig, связанного с объявлением пространства имен и префиксными именами? - PullRequest
2 голосов
/ 27 марта 2012

Я создаю новый XML-документ с нуля, используя XML :: Twig . Корневой элемент должен иметь префикс и объявление пространства имен. Все дети также должны принадлежать этому пространству имен и использовать этот префикс.

Вывод должен быть примерно таким:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<abc:root xmlns:abc="http://www.somehost.com/abc-data/ns/5.0.0" version="5.0.0.0">
 <abc:element name="myElement">
  This is my element
 </abc:element> 
</abc:root>

Полагаю, это будет выглядеть примерно так:

my $new_twig = XML::Twig->new(map_xmlns => {'http://www.somehost.com/abc-data/ns/5.0.0' => "abc"}, pretty_print => 'indented');

my $root = XML::Twig::Elt->new('root');
$new_twig->set_encoding('UTF-8');
$new_twig->set_standalone("no");
$new_twig->set_root( $root);

my $element = XML::Twig::Elt->new('element' => {'name'=>'myElement};
$element->set_text('This is my element');
$element->paste(last_child=>$root);

# print in a file
open (TMP, "> $new_file_name");   
select TMP;
$new_twig->print(\*TMP);
close TMP;

Это может показаться простым, но я все еще новичок в Perl, и это доставляет мне трудности! Спасибо за вашу помощь !!!

1 Ответ

4 голосов
/ 27 марта 2012

Модуль XML::Twig больше подходит для обработки существующего XML, а не для создания новых данных с нуля. Все, что вам нужно для создания нового XML-документа - это класс XML::Twig::Elt: основной класс XML::Twig не имеет значения.

Существует много способов создания XML-документа. Вот пример, который создает XML, который вы показали в качестве примера

use strict;
use warnings;

use XML::Twig;

my $new_file_name = 'new.xml';

my $root = XML::Twig::Elt->new('abc:root', {
  'xmlns:abc' => "http://www.somehost.com/abc-data/ns/5.0.0",
  version => "5.0.0.0",
});
$root->insert_new_elt('abc:element' => {name => 'myElement'}, 'This is my element');
$root->set_pretty_print('indented');
$root->print_to_file($new_file_name);

выход

<abc:root version="5.0.0.0" xmlns:abc="http://www.somehost.com/abc-data/ns/5.0.0">
  <abc:element name="myElement">This is my element</abc:element>
</abc:root>

UPDATE

Если вам сложно обновить до последней версии XML::Twig, вы можете добиться эквивалентного эффекта, заменив вызов на print_to_file на

open my $out, '>:utf8', $new_file_name or die qq(Cannot create "$filename": $!);
$root->print($out);
...