php с xml внутри cdata - PullRequest
       27

php с xml внутри cdata

1 голос
/ 18 марта 2019

У меня есть документ XML с другим документом XML внутри cdata. Мне нужно прочитать внутренний XML, но этот XML имеет некоторые недопустимые XML-символы, такие как «&», поэтому он включен в cdata.

Пример:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Body>
      <outResponse>
         <outReturn>
            <resultData><![CDATA[<?xml version="1.0" encoding="UTF-8"?><DATA><group ID="P12"><FLD NAME="companycode">E173</FLD><FLD NAME="data_link">https://local-services/getkey?&api_key=9999</FLD></group></DATA>]]></resultData>
         </outReturn>
      </outResponse>
   </soapenv:Body>
</soapenv:Envelope>

В этом примере мне нужно получить значение из тега companycode fld.

Я уже пробовал это, используя

$myXML = simplexml_load_string($xmlResponse->xpath('//resultData')[0], 'SimpleXMLElement', LIBXML_NOCDATA);

Но это не работает. Все содержимое resultData кодируется (все символы «<>» и «&», даже символы из узлов), но затем я не могу загрузить полученный xml, чтобы получить искомое значение.

Я также безуспешно пытался использовать DOMDocument (). Проблема всегда одна и та же: загрузите xml внутри cdata, чтобы я мог получить значение целевого элемента.

Единственный способ, которым я смог достичь этого, - это работать с содержимым cdata как строкой и создавать отыскивание значения "&" для "&". Затем я могу загрузить xml и получить значение, но это не очень хорошая практика, потому что я могу получить xml с другими символами, которые необходимо кодировать.

Так что мне нужен способ загрузки этого xml, не игнорируя cdata или словами порядка, не игнорируя необходимость автоматической замены некоторых символов.

Есть идеи о том, как этого добиться?

спасибо

...