Доступ к инструкциям по обработке с помощью PHP SimpleXML - PullRequest
0 голосов
/ 29 декабря 2011

Довольно просто - есть ли способ получить доступ к данным узла инструкции обработки, используя SimpleXML?Я понимаю, что SimpleXML, ну, просто;в результате он имеет ряд ограничений, преимущественно работающих со узлами смешанного содержимого.

Пример:

Test.xml

<test>
    <node>
        <?php /* processing instructions */ ?>
    </node>
</test>

Parse.php

$test = simplexml_load_file('Test.xml');
var_dump($test->node->php); // dumps as a SimpleXMLElement, so it's sorta found,
                            // however string casting and explicitly calling
                            // __toString() yields an empty string

Так это просто техническое ограничение, накладываемое простотой SimpleXML, или есть способ?Я перейду на SAX или DOM, если необходимо, но SimpleXML был бы хорош.

Ответы [ 2 ]

1 голос
/ 10 июля 2013

Узел SimpleXML, к которому вы обращаетесь здесь:

$test->node->php

так или иначе является той инструкцией обработки.Но этого тоже как-то нет.Пока больше нет элементов с тем же именем, вы можете изменить содержимое инструкции обработки:

$test->node->php = 'Yes Sir, I can boogie. ';

$test->asXML('php://output');

Это создает следующий вывод:

<?xml version="1.0"?>
<test>
    <node>
        <?php Yes Sir, I can boogie. ?>
    </node>
</test>

Исходное значениеэтой инструкции обработки была перезаписана.

Однако только запись в это свойство не означает, что вы можете получить к нему доступ и для чтения.Как вы сами поняли, это односторонний путь.

В SimpleXML в общем случае следует учитывать, что инструкции по обработке не существуют.Они все еще находятся в документе, но SimpleXML на самом деле не предоставляет к ним доступ.

DOMDocument позволяет вам делать это вместо этого, и он работает вместе с simplexml:

$doc   = dom_import_simplexml($test)->ownerDocument;
$xpath = new DOMXPath($doc);

# prints "/* processing instructions */ ", the value of the first PI:

echo $xpath->evaluate('string(//processing-instruction("php")[1])');
1 голос
/ 29 декабря 2011

Проблема в том, что <?php?> считается тегом ... поэтому он разбирается в один большой элемент тега.Вам нужно будет сделать:

$xml = file_get_contents('myxmlfile.xml');
$xml = str_replace('<?php', '<![CDATA[ <?php', $xml);
$xml = str_replace('?>', '?> ]]>', $xml);
$xml = simplexml_load_string($xml, "SimpleXMLElement", LIBXML_NOCDATA);

Я не совсем уверен, что это будет работать, но я думаю, что это будетПроверьте это ...

...