Perl 如何在XML::LibXML中注册实体进行解析?
加载具有未知实体的XML文档会导致错误:Perl 如何在XML::LibXML中注册实体进行解析?,perl,xml-libxml,Perl,Xml Libxml,加载具有未知实体的XML文档会导致错误: $ perl -MXML::LibXML -lE 'XML::LibXML->load_xml(string => "<doc> </doc>");' :1: parser error : Entity 'nbsp' not defined <doc> </doc> ^ $perl-MXML::LibXML-lE'XML::LibXML
$ perl -MXML::LibXML -lE 'XML::LibXML->load_xml(string => "<doc> </doc>");'
:1: parser error : Entity 'nbsp' not defined
<doc> </doc>
^
$perl-MXML::LibXML-lE'XML::LibXML->load_XML(string=>“”);'
:1:分析器错误:未定义实体“nbsp”
^
如何使XML::LibXML解析该XML文档并识别
并用Unicode不间断空格字符替换它?您需要添加一个包含实体的DTD。未经测试:
<!DOCTYPE just_make_it_work [
<!ENTITY nbsp " ">
]>
<doc> </doc>
您需要添加包含实体的DTD。未经测试:
<!DOCTYPE just_make_it_work [
<!ENTITY nbsp " ">
]>
<doc> </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分配给文档?