2013-03-09 82 views
0

我已經創建了一個simplexml php文件,它將加載所有我想要的xml項目。唯一的問題是在具有屬性的項目下面存在子項目。當我試圖拉動兒童物品時,什麼也沒有顯示。我還是比較新的使用SimpleXMLPHP讀取屬性下的XML項目

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; 
+0

你的XML似乎並不正確。Mediainfo和File缺少結束標記 – 2013-03-09 08:31:46

+0

@ParahatMelayev我在複製它時忘了強調它。感謝您注意它 – Ryahn 2013-03-09 08:33:20

+0

'$ xml-> track ['General'];'是屬性,而不是節點 – Wrikken 2013-03-09 08:37:27

回答

1

在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

+0

我試圖抓住具有屬性的元素下的子元素。如果我刪除了屬性,我可以抓住它。 – Ryahn 2013-03-09 08:42:53

+0

我更新了答案。我不明白,你的XML包含更多的元素,並且你明確需要帶有特定類型屬性的track元素。您應該使用xpath來獲取屬性條件。 – hakre 2013-03-09 09:10:17

+0

請注意,以這種方式使用XPath,您將不得不爲每個要處理的類型設置單獨的循環。您可以循環遍歷所有曲目並根據每種類型決定要執行的操作。 – IMSoP 2013-03-10 21:25:44

-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/>"; 
} 
+0

您正在使用哪種IDE?您可能正在尋找更多常見的評論,提示大多數IDE中的變量類型:http://stackoverflow.com/a/1798793/367456 – hakre 2013-03-09 08:45:09

0

混亂這裏是和之間的屬性。語法$xml->track['General']檢索名稱爲「常規」的屬性的值,例如,它會從<track General="hello" />獲得「你好」。

在你的情況,不過,"General"是一個屬性的值名稱type<track type="General">。因此,如果您想知道特定曲目是否屬於「常規」類型,則需要使用if ($xml->track['type'] == 'General')

我還假設你的文件中有很多track元素,所以你需要循環它們,就像你在數組中一樣:foreach ($xml->track as $track);如果<MediaInfo>容器內有多個<File>元素,則需要兩個嵌套循環。 (如果你不這樣做,你將永遠只能看第一<File>,和第一<track>

因此,採取三個「類型」你在你的例子顯示,你的代碼應該結束了類似這個:

$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; 
     } 
    } 
}