0

非常に簡単です-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があれば便利です。

4

2 に答える 2

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);

これがうまくいくかどうかは完全にはわかりませんが、うまくいくと思います。それをテストしてください...

于 2011-12-29T15:31:22.303 に答える
1

ここでアクセスする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])');
于 2013-07-09T23:45:00.123 に答える