Как прочитать и изменить тег <! Doctype> и <? xml version = "1.0"?> в xml twig?

Я новичок в ветке XML... как читать и изменять <!DOCTYPE article SYSTEM "loose.dtd"> а также <?xml version="1.0" encoding="UTF-8"?>, как я могу изменить в этом теге.. потому что я не знаю, как это прочитать и изменить этот тег в 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> тег, можете ли вы помочь этому процессу?

2 ответа

Решение

Вы можете попробовать следующее (код это прокомментировано). Важный момент, чтобы понять это, чтобы создать новый 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>

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

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

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

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

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

В основном вы можете прочитать DTD, правильно вывести его обратно и обновить сущности, > но не намного.

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

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

Другие вопросы по тегам