【发布时间】:2017-11-06 11:38:29
【问题描述】:
我正在尝试创建以下包含实体声明的 DTD:
<!DOCTYPE LinkSet PUBLIC "-//NLM//DTD LinkOut 1.0//EN" "https://www.ncbi.nlm.nih.gov/projects/linkout/doc/LinkOut.dtd"
[ <!ENTITY icon.url "https://example.com/icon.png">
<!ENTITY base.url "https://example.com/content/" > ]>
我可以在没有实体引用的情况下成功创建 DOCTYPE :
#!/usr/bin/perl -w
use strict;
use XML::LibXML;
my $doc = XML::LibXML::Document->new('1.0','UTF-8');
my $dtd = $doc->createInternalSubset( "LinkSet", "-//NLM//DTD LinkOut 1.0//EN", "https://www.ncbi.nlm.nih.gov/projects/linkout/doc/LinkOut.dtd" );
my $ls = $doc->createElement( "LinkSet" );
$doc->setDocumentElement($ls);
print $doc->toString;
exit;
结果:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE LinkSet PUBLIC "-//NLM//DTD LinkOut 1.0//EN" "https://www.ncbi.nlm.nih.gov/projects/linkout/doc/LinkOut.dtd">
<LinkSet/>
XML::LibXML documentation 展示了如何向文档添加实体引用,但没有展示如何在 DOCTYPE 中声明实体。
similar (but PHP-based) question 指向将实体引用创建为字符串并对其进行解析。 这也是 Perl 中最好的方法吗?
【问题讨论】:
-
实体声明是
XML_ENTITY_DECL类型的节点,作为 DTD 节点的子节点存在。$node->addChild不支持添加XML_ENTITY_DECL类型的节点,因此即使您可以创建它也无法添加。因此,已经发布的解析生成方法解决方案可能是做你想做的唯一方法。
标签: xml perl entity dtd xml-libxml