Perl 如何在XML::LibXML中注册实体进行解析?

Perl 如何在XML::LibXML中注册实体进行解析?,perl,xml-libxml,Perl,Xml Libxml,加载具有未知实体的XML文档会导致错误: $ perl -MXML::LibXML -lE 'XML::LibXML->load_xml(string => "<doc>&nbsp;</doc>");' :1: parser error : Entity 'nbsp' not defined <doc>&nbsp;</doc> ^ $perl-MXML::LibXML-lE'XML::LibXML

加载具有未知实体的XML文档会导致错误:

$ perl -MXML::LibXML -lE 'XML::LibXML->load_xml(string => "<doc>&nbsp;</doc>");'
:1: parser error : Entity 'nbsp' not defined
<doc>&nbsp;</doc>
           ^
$perl-MXML::LibXML-lE'XML::LibXML->load_XML(string=>“”);'
:1:分析器错误:未定义实体“nbsp”
^
如何使XML::LibXML解析该XML文档并识别
并用Unicode不间断空格字符替换它?

您需要添加一个包含实体的DTD。未经测试:

<!DOCTYPE just_make_it_work [
    <!ENTITY nbsp "&#160;">
]>
<doc>&nbsp;</doc>



您需要添加包含实体的DTD。未经测试:

<!DOCTYPE just_make_it_work [
    <!ENTITY nbsp "&#160;">
]>
<doc>&nbsp;</doc>



不是一个。因此,它需要由XML文档的特定模式定义

例如,如果您正在解析XHTML,则应在顶部使用以下选项之一来定义所有XHTML实体:



如果模式的DTD没有定义
,则可以使用实际的非中断空格或
 


请注意,使用上述DOCTYPE意味着每次解析以这种方式提及它们的文档时,解析文档需要XML::LibXML获取
xhtml1 strict.dtd
xhtml11.dtd
,这是一种资源浪费。将以下内容添加到程序中可避免:

use XML::Catalogs::HTML -libxml;
请注意,使用XML::Catalogs::HTML时,以下
DOCTYPE
指令就足够了:




专业提示:为XML::LibXML解析器提供
no_network
选项,以确保它不会意外地从internet获取DTD。这不会阻止XML::Catalogs::HTML工作,所以它是一个很好的组合

不是一个。因此,它需要由XML文档的特定模式定义

例如,如果您正在解析XHTML,则应在顶部使用以下选项之一来定义所有XHTML实体:



如果模式的DTD没有定义
,则可以使用实际的非中断空格或
 


请注意,使用上述DOCTYPE意味着每次解析以这种方式提及它们的文档时,解析文档需要XML::LibXML获取
xhtml1 strict.dtd
xhtml11.dtd
,这是一种资源浪费。将以下内容添加到程序中可避免:

use XML::Catalogs::HTML -libxml;
请注意,使用XML::Catalogs::HTML时,以下
DOCTYPE
指令就足够了:





专业提示:为XML::LibXML解析器提供
no_network
选项,以确保它不会意外地从internet获取DTD。这不会阻止XML::Catalogs::HTML工作,所以它是一个很好的组合

我不知道如何以这种方式影响XML::LibXML,但XML模式下的Mojo::DOM是有效的:
perl-MMojo::DOM-lE'say Mojo::DOM->new->XML(1)->parse(“”->to_string'
@Grinnz,哎哟!那辆车太多了!XML模式可以根据需要定义
。当然,但实际上重要的可能性接近于零。@Grinnz,为什么您会认为几乎没有什么比XHTML使用不同的实体?(或者你假装这个bug只是关于
?)我不知道如何以这种方式影响XML::LibXML,但是XML模式下的Mojo::DOM是有效的:
perl-MMojo::DOM-lE'say Mojo::DOM->new->XML(1)->parse(“”->to_string'
@grinz,哎哟!那辆车太多了!XML模式可以根据需要定义
。当然,但实际上重要的可能性接近于零。@Grinnz,为什么您会认为几乎没有什么比XHTML使用不同的实体?(或者你假装这个bug只是关于
?)这个答案假设整个文档都是xhtml,而我的情况不是这样。我们得到的是xml文档(没有名称空间),在一些元素中,有一些带有html实体的xhtml片段打破了xml::LibXML解析。这个答案假设整个文档是xhtml,而我的情况不是这样。我们得到的是xml文档(没有名称空间),在一些元素中,有一些带有html实体的xhtml片段打破了xml::LibXML解析。这种(doctype+实体标记)可以工作,但这意味着在解析之前必须编辑原始xml?在XML::LibXML中解析文档之前,有没有办法将DTD或doctype分配给文档?这(doctype+实体标记)是可行的,但这意味着在解析之前必须编辑原始XML?在XML::LibXML中解析文档之前,是否有任何方法可以将DTD或doctype分配给文档?