1

理解できないphp simplexml xpathに愚かな問題があります。

xml 構造:

<tv>
  <programme start="zeitbla" stop="zeitbla2" channel="19">
    <title>erstertitelbla</title>
    <desc>blablabeschreibung</desc>
    <category lang="ja_JP">情報</category>
    <category lang="en">information</category>
  </programme>
  <programme start="zeitbla" stop="zeitbla2" channel="19">
    <title>zweitertitelbla</title>
    <desc>blablabeschreibung</desc>
    <category lang="ja_JP">ニュース・報道&lt;/category>
    <category lang="en">news</category>
  </programme>
</tv>

phpコード:

$domtemp = new domDocument;
$domtemp->load("file.xml");
$fullfile = simplexml_import_dom($domtemp);

foreach($fullfile->programme as $program){
    $category = $program->xpath('//category[@lang="en"]');
    echo $category[0]."\n";
}

私の質問は:

すべてのループ パスの最初のエントリからカテゴリのみを取得するのはなぜですか?

出力:

information

information

編集:

次の方法で問題を回避しました。

$domtemp = new domDocument;
$domtemp->load("file.xml");
$fullfile = simplexml_import_dom($domtemp);
foreach($sxe->programme as $program){
    $program  = simplexml_load_string($program->asXML());
    $category = $program->xpath('//category[@lang="en"]');
    echo "{$category[0]}\n";

しかし、これが期待どおりに機能しない理由を知りたいです。

ご挨拶

BluBb_mADe

4

2 に答える 2

3

@hakre のコメントに基づいて、回答にいくつかの調整を加えたので、XPath クエリを少し変更するだけで済みます。

category[@lang="en"]

それ以外の

//category[@lang="en"]

programmeこれにより、以前のように XML ドキュメント全体ではなく、各ノードをクエリ コンテキストとして維持できるようになるためです。コードパッドで例を作成しました。ここでは、完全に機能していることを確認できます。

<?php
$xml = <<<XML
<tv>
  <programme start="zeitbla" stop="zeitbla2" channel="19">
    <title>erstertitelbla</title>
    <desc>blablabeschreibung</desc>
    <category lang="ja_JP">情報</category>
    <category lang="en">information</category>
  </programme>
  <programme start="zeitbla" stop="zeitbla2" channel="19">
    <title>zweitertitelbla</title>
    <desc>blablabeschreibung</desc>
    <category lang="ja_JP">ニュース・報道&lt;/category>
    <category lang="en">news</category>
  </programme>
</tv>
XML;

$sxe = new SimpleXMLElement($xml);

foreach($sxe->programme as $program){
    $category = $program->xpath('category[@lang="en"]');
    echo "{$category[0]}\n";
}

出力:

information
news

補足として、 a をロードしてから にインポートする代わりに、このsimplexml_load_file関数を使用できます。DOMDocumentSimpleXMLElement

于 2013-07-19T20:42:47.067 に答える