2013-11-28 1 views
0

Я новичок в xml twig ... как читать и изменять <!DOCTYPE article SYSTEM "loose.dtd"> и <?xml version="1.0" encoding="UTF-8"?>. как я могу модификации в этом теге .. потому что я не знаю, как это читать и изменять этот тег в XML :: Twig ...как читать и изменять <!Doctype> тег и <? Xml version = "1.0"?> В xml twig?

мой вход:

<?xml version="1.0" encoding="UTF-8"?> 

<!DOCTYPE art SYSTEM "loose.dtd"> 
<art> 
<fr> 
<p>Text</p> 
<p>Text</p> 
</fr> 
<fr> 
<p>Text</p> 
<p>Text</p> 
</fr> 
</art> 

мне нужен выход, как:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<DTD> 
<Contents type="&lt;!DOCTYPE article SYSTEM &quot;loose.dtd&gt;"/> 
</DTD> 
<art> 
<fr> 
<p>Text</p> 
<p>Text</p> 
</fr> 
<fr> 
<p>Text</p> 
<p>Text</p> 
</fr> 
</art> 

как можно изменить <?xml ?> and <!Doctype> тег, вы можете любой помощи этот процесс ..

+1

Ваш выход xml не очень хорошо сформирован. Он имеет два корневых элемента и возможен только один. – Birei

ответ

1

вы можете попробовать следующее (код он комментировал). Важно, чтобы понять это, чтобы создать новый twig, скопируйте все элементы, которые вы хотите сохранить и создать то, что он изменяет:

#!/usr/bin/env perl 

use warnings; 
use strict; 
use XML::Twig; 

## Create a twig based in an input xml file. 
my $twig = XML::Twig->new; 
$twig->parsefile(shift); 

## Create a new twig that will be the output. 
my $new_twig = XML::Twig->new(pretty_print => 'indented'); 

## Create a root tag. 
$new_twig->set_root(XML::Twig::Elt->new('root')); 

## Create the xml processing instruction. 
my $e = XML::Twig::Elt->new('k' => 'v'); 
$e->set_pi('xml', 'version="1.0" encoding="UTF-8" standalone="yes"'); 
$e->move(before => $new_twig->root); 

## Copy the whole tree from the old twig. 
my $r = $twig->root; 
$r->paste(first_child => $new_twig->root); 

## Copy the doctype from the old twig to the new one. 
my $contents_elt = XML::Twig::Elt->new(Contents => { type => $twig->doctype }); 
my $dtd_elt = XML::Twig::Elt->new(DTD => '#EMPTY'); 
$contents_elt->move(last_child => $dtd_elt); 
$dtd_elt->move(first_child => $new_twig->root); 

## Print the whole twig created. 
$new_twig->print; 

Выполнить это нравится:

perl script.pl xmlfile 

Это дает:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><root> 
    <DTD> 
    <Contents type="&lt;!DOCTYPE art SYSTEM &quot;loose.dtd&quot;>&#x0a;"/> 
    </DTD> 
    <art> 
    <fr> 
     <p>Text</p> 
     <p>Text</p> 
    </fr> 
    <fr> 
     <p>Text</p> 
     <p>Text</p> 
    </fr> 
    </art> 
</root> 
+0

отличный ответ @Birei – AlexPandiyan

0

Найдя этот вопрос при попытке сделать что-то подобное: Assembling XML in Perl

Вы, наверное, не хотят set_pi сделать заголовок XML, и вместо этого:

$twig->set_xml_version("1.0"); 
$twig->set_encoding('utf-8'); 
$twig->set_standalone('yes'); 

XML::Twig документ упоминает DTD обработку, хотя:

ОТД обработки ОТД методы обработки довольно прослушивание. Никто их не использует, и кажется, что очень трудно заставить их работать во всех случаях, в том числе с несколькими немного> несовместимыми версиями XML :: Parser и libexpat.

В принципе, вы можете прочитать DTD, правильно вернуть его и обновить объекты,> но не намного больше.

Так что используйте XML :: Twig с отдельными документами или с документами, относящимися к> внешнему DTD, но не ожидайте, что он будет правильно разбирать и даже выводить DTD.

Учитывая это, решение, которое вы получили от Birei, вероятно, будет лучшим способом его обработки.