【发布时间】:2014-08-26 11:01:18
【问题描述】:
我的 XML 文档包含封装为 CDATA 的其他 XML 文档,如下所示:
<mds>
<md>
<value>
<![CDATA[<?xml version="1.0" encoding="UTF-8"?><record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/">
<dc:title>some text containing &</dc:title></record>]]>
</value>
</md>
</mds>
我使用 LibXML 从中提取这个 XML 和 dc:title:
$dcrawData = <get the CDATA from above>;
$dcDOM = $::PRSR->load_xml(expand_entities => 0, string => $dcRawData);
$dcTitle = $dcDOM->findvalue("//dc:title");
然后我通过字符串替换将它插入到另一个 XML 部分:
<mods:titleInfo>
<mods:title>some text containing &</mods:title>
</mods:titleInfo>
如您所见,& 实体被扩展并成为单个 &。这是一个问题,因为现在生成的 XML 会生成一个解析错误,因为任何解析器都希望这里有一个命名实体。
有没有办法防止 LibXML 在使用 findvalue 时扩展命名实体或在使用该值之前重新编码它们?其他记录中可能还有其他人。 expand_entities 选项没有区别。
【问题讨论】:
标签: xml perl named-entity-recognition