0

プルしたいすべてのxmlアイテムをロードするsimplexml phpファイルを作成しました。唯一の問題は、属性を持つアイテムの下にある子アイテムがあることです。子アイテムをプルしようとすると、何も表示されません。私はまだsimplexmlの使用に比較的慣れていません

XML

<Mediainfo version="0.7.62">
    <File>
        <track type="General">
            <UniqueID_String>242652904449958064145306342749155800074 (0xB68D3FDDBE0F9B3E865F70325496B40A)</UniqueID_String>
            <CompleteName>D:\Encoder\videos\raw\063 - 077 (Season_02)\064 - A Pirate-Loving Town Arrival at Whiskey Peak.mkv</CompleteName>
            <Format>Matroska</Format>
            <Format_Version>Version 1</Format_Version>
            <FileSize_String>40.0 MiB</FileSize_String>
            <Duration_String>24mn 6s</Duration_String>
            <OverallBitRate_String>232 Kbps</OverallBitRate_String>
            <Encoded_Date>UTC 2008-08-26 15:24:58</Encoded_Date>
            <Encoded_Application>mkvmerge v2.2.0 (&apos;Turn It On Again&apos;) built on Mar  4 2008 12:58:26</Encoded_Application>
            <Encoded_Library_String>libebml v0.7.7 + libmatroska v0.8.1</Encoded_Library_String>
        </track>
    </File>
</Mediainfo>

掴もうとしている

<UniqueID_String>242652904449958064145306342749155800074 (0xB68D3FDDBE0F9B3E865F70325496B40A)</UniqueID_String>

<track type="General">

PHP

$lib  = simplexml_load_file("media.xml");
$xml = $lib->File;
$gen = $xml->track['General'];
$vid = $xml->track['Video'];
$aud = $xml->track['Audio'];


//General
$format = $gen->Format;
$app = $gen->Encoded_Application;
$size = $gen->FileSize_String;
$dur = $gen->Duration_String;

echo $format;

//Video
$vformat = $vid->Format;
$vbit = $vid->BitRate_Nominal_String;
$width = $vid->Width_String;
$height = $vid->Height_String;
$aspect = $vid->DisplayAspectRatio_String;
$frame = $vid->FrameRate_String;
$encode = $vid->Encoded_Library_String;
$encodes = $vid->Encoded_Library_Settings;

//Audio
$aformat = $aud->Format;
$compress = $aud->Compression_Mode_String;
$lang = $aud->Language_String;
4

3 に答える 3

1

SimpleXMLの属性子要素へのアクセスには違いがあります。

したがって、アクセスしたい場合:

  • 子要素はオブジェクトプロパティアクセスを使用します
  • 属性は配列アクセスを使用します

これは、 SimpleXMLの基本的な例でも概説されています。

あなたの場合、あなたは子供の子供にアクセスしたいです:

$xml = simplexml_load_file("data-15308758.xml");

### first track in first file ###
echo $xml->File->track->UniqueID_String, "\n"; 

### each track with attribute type="General" in each file ###
$count = 0;
foreach($xml->xpath('/*/File/track[@type="General"]') as $track)
{
    echo ++$count, ': ', $track->UniqueID_String, "\n";
}

http://eval.in/12273を参照してください

于 2013-03-09T08:37:35.990 に答える
0

ここでの混乱は、属性の名前値の間です。この構文$xml->track['General']は、「General」という名前の属性の値を取得します。たとえば、から「hello」を取得し<track General="hello" />ます。

ただし、あなたの場合は、名前が:の属性"General"です。したがって、特定のトラックが「一般」タイプであるかどうかを知りたい場合は、 を使用する必要があります。type<track type="General">if ( $xml->track['type'] == 'General' )

また、ファイルには多くのtrack要素が含まれていると想定しているため、配列にある場合と同じように、それらをループする必要がありますforeach ( $xml->track as $track )。コンテナー内に複数の<File>要素がある場合は<MediaInfo>、2 つのネストされたループが必要になります。(これを行わない<File>と、最初の と最初の だけを見ることになり<track>ます。)

したがって、例に示す 3 つの「タイプ」を使用すると、コードは次のようになります。

$lib  = simplexml_load_file("media.xml");
foreach ( $lib->File as $file )
{
    foreach ( $file->track as $track )
    {
        switch ( (string)$track['type'] )
        {
            case 'General':
                $format = $gen->Format;
                $app = $gen->Encoded_Application;
                $size = $gen->FileSize_String;
                $dur = $gen->Duration_String;
            break;
            case 'Video':
                $vformat = $vid->Format;
                $vbit = $vid->BitRate_Nominal_String;
                $width = $vid->Width_String;
                $height = $vid->Height_String;
                $aspect = $vid->DisplayAspectRatio_String;
                $frame = $vid->FrameRate_String;
                $encode = $vid->Encoded_Library_String;
                $encodes = $vid->Encoded_Library_Settings;
            break;
            case 'Audio':
                $aformat = $aud->Format;
                $compress = $aud->Compression_Mode_String;
                $lang = $aud->Language_String;
            break;
        }
    }
}
于 2013-03-10T21:23:27.900 に答える
-1

これを試して

$doc = new DOMDocument();
$doc->load('media.xml');
$xpd = new DOMXPath($doc);
false&&$node = new DOMElement();
$result = $xpd->query('//File/track[@type="General"]/UniqueID_String'); // your path
foreach($result as $node){
    echo $node->nodeName ." => ". $node->nodeValue ."<br/>";
}
于 2013-03-09T08:44:36.363 に答える