У меня есть XML-документы, содержащие другие XML-документы, инкапсулированные как CDATA, например:
<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>
Я извлекаю этот XML и dc:title из него, используя LibXML:
$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 не имеет значения.