【问题标题】:how to read and change <!Doctype> tag and <?xml version="1.0"?> in xml twig?如何在 xml 树枝中读取和更改 <!Doctype> 标记和 <?xml version="1.0"?>?
【发布时间】:2013-12-14 00:07:32
【问题描述】:

我是 xml 树枝的新手...如何阅读和更改 &lt;!DOCTYPE article SYSTEM "loose.dtd"&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt; 。我该如何修改这个标签..因为我不知道如何在 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>

如何更改&lt;?xml ?&gt; and &lt;!Doctype&gt; 标签,有谁能帮助这个过程..

【问题讨论】:

  • 您的 xml 输出格式不正确。它有两个根元素,并且只有一个是可能的。

标签: xml perl xml-parsing xml-twig


【解决方案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>

【讨论】:

    【解决方案2】:

    在尝试做类似的事情时发现了这个问题: 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 处理:

    DTD 处理 DTD 处理方法非常有问题。没有人使用它们,而且似乎很难让它们在所有情况下都能正常工作,包括几个稍微不兼容的 XML::Parser 和 libexpat 版本。

    基本上,您可以读取 DTD,将其正确输出并更新实体,>但仅此而已。

    因此,将 XML::Twig 与独立文档或引用 >external DTD 的文档一起使用,但不要期望它能够正确解析甚至输出回 >DTD。

    考虑到这一点,您从Birei那里得到的解决方案可能是最好的处理方法。

    【讨论】:

      猜你喜欢
      • 2019-06-02
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      • 2015-07-15
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多