избежать ошибок simpleXML - xml


0
 <!-- MEMCACHE empty -->

Вышеизложенное теперь вызывает проблемы для script, поскольку теперь он помещается в верхнюю часть файлов XML, к которым я пытаюсь удаленно получить доступ. simpleXML не нравится тот факт, что файл XML больше не сформирован. Я попытался избежать ошибок, но это не показалось, что это трюк. Может ли кто-нибудь указать мне, как это решить?

Источник
  •  17
  •  2
  • 22 апр 2020 2020-04-22 16:25:56

2 ответа

0

Если он находится в самой верхней части файла, например

<!-- MEMCACHE empty -->
<?xml version="1.0" ?>
<root> ... </root>

Тогда я думаю, что лучше всего будет preg_replace("/^&lt;!-- MEMCACHE empty --&gt;$/", "", $xml_file) пустым или нулевым.

Это потому, что <?xml version="1.0" ?> должна быть первой строкой файла, чтобы он был корректным XML в любом случае, DOM, SAX, SimpleXML или иным образом.

  • 22 апр 2020 2020-04-22 16:25:57
1

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

Возможно, что-то довольно простое, основанное на str_replace, если эта "MEMCACHE empty" вещь всегда одна и та же; else, некоторое регулярное выражение, вероятно, сделает трюк; -)

Итак:

  • получить удаленный файл в строку
  • подавить вещь в начале
  • введите эту строку в simplexml_load_string

Может быть, это не совсем "чистый"... Но должно работать, быстро и просто...


Например, если ваш не-XML выглядит так:

$xml_string = <<<XML
&lt;!-- MEMCACHE empty --&gt;
<?xml version="1.0" ?>
<data>
    <glop>TEST</glop>
    <other>GLOP</other>
</data>
XML;

Вы можете использовать это:

$real_xml_string = str_replace("&lt;!-- MEMCACHE empty --&gt;n", , $xml_string);

Обратите внимание на "n" в конце: вам нужно удалить эту новую строку; -)

Что дает строку, содержащую:

<?xml version="1.0" ?>
<data>
    <glop>TEST</glop>
    <other>GLOP</other>
</data>

Это хорошо сформированный XML; поэтому вы можете загрузить его:

$xml = simplexml_load_string($real_xml_string);
var_dump($xml);

И вы получите то, что хотите:

object(SimpleXMLElement)[1]
  public glop => string TEST (length=4)
  public other => string GLOP (length=4)


Если "статус" в MEMCACHE не всегда "пуст", вы можете использовать некоторое регулярное выражение; что-то вроде этого, я думаю, могло бы сделать вместо вызова str_replace:

$real_xml_string = preg_replace("#&lt;!-- MEMCACHE (w+) --&gt;n#", , $xml_string);

(Возможно, нужно немного адаптироваться, в зависимости от ваших потребностей)


Конечно, в вашем случае $xml_string не будет храниться в исходном коде, но получается через что-то вроде curl или file_get_contents, я полагаю.