非常简单——是否有任何方法可以使用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会更好。
问题是<? 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);
我不完全确定这是否有效,但我认为它会的。
您在这里访问的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])');