2012-11-03 48 views
1

元素我需要找到並在Evernote的XML文件替換。它包含多個條目是這樣的:的XPath替換[EN-媒體]與[IMG]

<en-media alt="Evernote Logo" hash="4914ced8925f9adcc1c58ab87813c81f" type="image/png"></en-media> 
<en-media alt="Evernote Logo" hash="4914dsd8925f9adcc1c58ab87813c81f" type="image/png"></en-media> 

<img src="https://sandbox.evernote.com/shard/s1/res/143c8ad0-da92-4271-8410-651b88e8a2f1" height="something" width="something"/> 
<img src="https://sandbox.evernote.com/shard/s1/res/143c8233-da92-4271-8410-651b88e8a2f1" height="something" width="something"/> 

我這樣做是因爲Evernote的的SDK固然缺少一個簡單的方法來顯示文本和MIME數據(圖像,PDF文件等在單個(或幾個容易)命令。)。

這是我在「發現」的嘗試,但現在我需要的「替換」:

$content=html_entity_decode($content); //content contains &nbsp; and &mdash; causing simplexml to complain 
$content=str_replace('&',htmlentities('&'),$content); //encode & -- Lewis & Clark 

$x = new SimpleXMLElement($content); 
$x = xpath('//en-media'); //find 
[?????] MYCODE_getLink(); //replace 
$content=$x->asXML(); //output 
$content=htmlentities($content); //put entities back 

回答

1

下面是我的解決辦法,剛剛追加,因爲我無法找出替換。我還需要反正刪除某些XML標籤爲最終的HTML呈現。無論如何,它的工作原理,所以我張貼在這裏,以防萬一它可以幫助你:

$f = new NoteFilter(); 
$f->notebookGuid="e0a42e90-0297-442f-8157-44a596e5b8b5"; //default 
//$f->notebookGuid="b733f6ab-e3b7-443a-8f5a-2bbe77ea1c1e"; //MyStuff 

$n = $noteStore->findNotes($authToken, $f, 0, 100); // Fetch up to 100 notes 
$total=$n->totalNotes; 
if (!empty($n->notes)) { 
foreach ($n->notes as $note) { 
    $fullNote = $noteStore->getNote($authToken, $note->guid, true, false, false, false); 
    $content = $fullNote->content; 


    $dom = new DOMDocument; 
    $dom->loadXml($content); 

    //list all <en-media> 
    $medias = $dom->getElementsByTagName('en-media'); 
    foreach ($medias as $media) { 
     $hash = $media->getAttribute('hash'); 
     $hash = hashXmlToBin($hash); //xml to bin for ByHash method below 
     $resource=$noteStore->getResourceByHash($authToken, $note->guid,$hash,0,0,0,0); 

     //get url 
     $url=resourceUrl($authToken,$resource); 

     //if image, show inline 
     $inline=array('image/png','image/jpeg','image/jpg','image/gif'); 
     if (in_array($resource->mime,$inline)) { 
      $img=$dom->createElement('img'); 
      $img->setAttribute('src', $url); 
      $img->setAttribute('width', $resource->width); 
      $img->setAttribute('height', $resource->height); 
     }else { //show link 
      $rewrite=array('application/pdf'=>'PDF'); 
      $mime=str_replace('application/','',$resource->mime); 
      $filename=$resource->attributes->fileName; 
      $img=$dom->createElement('a',"Download {$filename} ({$mime})"); 
      $img->setAttribute('href', $url); 
      $img->setAttribute('class', "download-attachement"); 
     } 
     // append to DOM 
     $media->appendChild($img); 
    }//foreach medias 
    $content=$dom->saveXML(); 
    $out[]=$content; 
    }//foreach notes 
    foreach ($out as $val) 
     print "<hr/>".$val; //each note 
}//notes exist 

/* 
* http://discussion.evernote.com/topic/4521-en-media-hash/ 
*/ 
function hashXmlToBin($hash) { 

    $chunks = explode("\n", chunk_split($hash,2,"\n")); 
    $calc_hash = ""; 
    foreach ($chunks as $chunk) { 
     $newdata=""; 
     if (!empty($chunk)) { 
      $len = strlen($chunk); 
      for($i=0;$i<$len;$i+=2) { 
       $newdata .= pack("C",hexdec(substr($chunk,$i,2))); 
      } 
      $bin_chunk = $newdata; 
      $calc_hash .= $bin_chunk; 
     } 
    } 
    return $calc_hash; 
} 

/* 
* return a resource url 
*/ 
function resourceUrl($authToken, $resource, $resize = FALSE, $thumbnailSize = 150) { 
    //build URL 
    if (!$resize) 
     $url=EVERNOTE_SERVER."/shard/".$_SESSION['shard']."/res/".$resource->guid; //originals 
    else 
     $url=EVERNOTE_SERVER."/shard/".$_SESSION['shard']."/thm/res/".$resource->guid."?size={$thumbnailSize}"; //thumbnail 

    return $url; 
} 
+0

令人驚歎。這應該是包含在示例應用程序。做得好! – ofosho