2011-12-29 8 views
0

かなり簡単 - SimpleXMLを使用して処理命令ノードのデータにアクセスする方法はありますか?私は、SimpleXMLはまあ単純であることを理解しています。その結果、多くの制限があり、主に混在したコンテンツノードで作業しています。PHPの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はうまくいくでしょう。

答えて

1

問題は<ですか? 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); 

私はこれがうまくいくとは思っていませんが、私はそうするでしょう。あなたはここにアクセス...

+0

ああ、私は見ます。 yuck - 私はDOM/SAXに戻ると思います。 – Dan

1

SimpleXMLのノードにそれを試す:

$test->node->php 

は何とかその処理命令です。しかし、それも何とかしていません。

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

その処理命令の元の値:

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

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

これは次の出力を作成します:限り、同じ名前を持つ他の要素が存在しないとして、あなたは処理命令の内容を変更することができます上書きされました。

ただし、そのプロパティへの書き込みだけでは、読み込みにもアクセスできるわけではありません。あなた自身を見つけたので、それは片道です。

一般に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])');