Как вставить ProcessingInstruction во вторую строку сгенерированного XML-файла?

#php #xml

#php #xml

Вопрос:

Я получил XML-файл, сгенерированный для меня сторонним веб-сайтом, который выглядит примерно так:

 <?xml version="1.0"?>
<results>
  <row></row>
  <row></row>
  <row></row>
</results>
  

Я добавляю ProcessingInstruction :

 $dom = new DOMDocument();
$dom->load($url); // $url point to the third party website's generated XML with structure like from above example
$xslt = $dom->createProcessingInstruction('xml-stylesheet', 'type="text/xsl" href="style.xsl"');
$dom->appendChild($xslt); //adds it to the very end, but needs to go on the second line
  

И в итоге получаем следующее:

 <?xml version="1.0"?>
<results>
  <row></row>
  <row></row>
  <row></row>
</results>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
  

Но мне нужно, чтобы это было так:

    <?xml version="1.0"?>
   <?xml-stylesheet type="text/xsl" href="style.xsl"?>
    <results>
      <row></row>
      <row></row>
      <row></row>
    </results>
  

Как это сделать?

Ответ №1:

Вы должны вставить инструкцию по обработке перед корневым элементом (тегом results). DOMNode::insertBefore — это немного странно, потому что вы должны вызвать его для родительского элемента и указать элемент, который вы хотите вставить в качестве первого параметра, и элемент, в который вы хотите вставить его раньше, в качестве второго параметра. $dom->documentElement ссылается на корень документа (= тег результатов).

 $dom = new DOMDocument();
$dom->load($url); 
$xslt = $dom->createProcessingInstruction('xml-stylesheet', 'type="text/xsl" href="style.xsl"');
$dom->insertBefore($xslt, $dom->documentElement);
echo $dom->saveXML();