0

SO のおかげで、ハイフン (<some-tag>) を使用して XML タグにアクセスする方法を理解できました。私が見たすべての例は、このようなことをしています。

$content = $xml->{'document-content'};

しかし、私にとってはうまくいきません、そしてこれはうまくいきます

$content = $xml->{document-content};

それは引用符なしです(覚えていないので、間違いかもしれません)。引用符を使用すると、このエラーが発生します

注意: 26 行目で /html/my/dir/myfile.php の非オブジェクトのプロパティを取得しようとしています

したがって、引用符なしで使用するだけだと思う​​でしょう。確かに、XML を解析している理由にたどり着くまではそうです。XML は ODT ファイルからのもので、最終的に PDF を生成するためのテンプレートとして使用されます。何かを開発している間、私は常に "E_ALL" エラー報告を使用します。設定すると、引用符なしで使用すると、これらの2つのエラーが発生します。

注意: 未定義の定数ドキュメントの使用 - 24 行目の /html/my/dir/myfile.php の「ドキュメント」を想定

注意: 未定義の定数コンテンツの使用 - 24 行目の /html/my/dir/myfile.php の「コンテンツ」を想定

ただし、ドキュメントの残りの部分は問題なく解析されます。問題は、PDF を作成する必要があり、「ヘッダー」を実行する PDF ジェネレーターが正しく設定されず、PDF が作成される前に「通知」エラーが出力される場合です。エラー報告をオフにすることを提案する人もいるかもしれませんが、PDF が機能していない場合、それらのエラーは表示されません。

実際、なぜ引用符なしで機能するのか、私は途方に暮れています。PHP 構文について私が知っていることはすべて、引用符がなければ (エラーが指摘するように) 定数であり、その前のどこかで定義する必要があるということです。そのため、その時点でパーサー全体が失敗するはずですが、そうではありません。実際には、パーサーが機能するのとは逆です。

ほとんどの場合、エラー報告を無効にせずに、これら 2 つの通知エラーを取り除く方法を知る必要があります。そして、それがどのように機能しているかは、プログラミングのすべての規範から大幅に逸脱しているように見えるため、引用符なしで機能する理由に非常に興味があります.

念のため、「$content」に至るまでのすべてのコードをここに記載します。

$zip = new ZipArchive;

if ($zip->open('../docs/myfile.odt') === true)
{
    $xmlstring = $zip->getFromName('content.xml');
    $zip->close();
}

// remove all namespaces and swaps out tab and space tags
$replace = array('office:', 'style:', 'draw:', 'fo:', 'text:', 'svg:', '<tab/>', '<s/>');
$value = array('', '', '', '', '', '', "\t", '&#160;');
$xmlstring = str_replace($replace, $value, $xmlstring);

$xmlstring = preg_replace_callback('/<s c="(.+?)"\/>/s', 'ReplaceSpaces', $xmlstring);

$xml = simplexml_load_string($xmlstring);
$content = $xml->{document-content};
4

1 に答える 1

0

私は何年にもわたって多くの XML ファイルと RSS フィードを解析してきましたが、答えは非常に単純です。SimpleXML を使用する場合、XML のメイン要素を参照する必要はありません。

<document-content>
    <tag1>
    </tag1>
    <tag2>
        <anothertag>
        </anothertag>
    </tag2>
</document-content>

したがって$xml->{document-content}->tag2、(または$xml->{0}->tag2)はまったく同じです$xml->tag2

私は、これが私の最初の odt ファイルのラウンドであると推測しています。

于 2016-03-31T14:38:46.663 に答える