2011-06-30 17 views
7

Lo que estoy tratando de obtener actualmente es solo el atributo de gd: email que es la "dirección =" nada más a partir del momento. Lo cual puedo llegar a la porción xml, diablos, incluso puedo obtener cualquier idea por decir, siempre y cuando esté dentro de las etiquetas, pero para obtener el atributo de cualquier dado como en mi caso ... Estoy completamente confundido. Solía ​​saber cómo hacerlo, pero ha pasado tanto tiempo desde que hice algo que no era simple para el uso de XML. por lo que la pata I hecho mi propio auto hasta ..Contactos PHP GMAIL Análisis XML con DOMDocument y cURL

<?xml version='1.0' encoding='UTF-8'?> 
    <feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:gContact='http://schemas.google.com/contact/2008' xmlns:batch='http://schemas.google.com/gdata/batch' xmlns:gd='http://schemas.google.com/g/2005'> 
     <id>[email protected]</id> 
     <updated>2011-06-30T00:07:48.706Z</updated> 
     <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact'/> 
     <title type='text'>Taco Bells's Contacts</title> 
     <link rel='alternate' type='text/html' href='http://www.google.com/'/> 
     <link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full'/> 
     <link rel='http://schemas.google.com/g/2005#post' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full'/> 
     <link rel='http://schemas.google.com/g/2005#batch' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full/batch'/> 
     <link rel='self' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full?max-results=5'/> 
     <link rel='next' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full?start-index=6&max-results=5'/> 
     <author> 
      <name>Taco Bell</name> 
      <email>[email protected]</email> 
     </author> 
     <generator version='1.0' uri='http://www.google.com/mate/feeds'>Contacts</generator> 
     <openSearch:totalResults>90</openSearch:totalResults> 
     <openSearch:startIndex>1</openSearch:startIndex> 
     <openSearch:itemsPerPage>5</openSearch:itemsPerPage> 
     <entry> 
      <id>http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/base/0</id> 
      <updated>2010-01-27T00:11:57.430Z</updated> 
      <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact'/> 
      <title type='text'>Taco B</title> 
      <link rel='http://schemas.google.com/contacts/2008/rel#edit-photo' type='image/*' href='http://www.google.com/mate/feeds/photos/media/xxxxxxxxxxxxxx%40gmail.com/0/8_XL_JoAPon1k7SNixI2iA'/> 
      <link rel='http://schemas.google.com/contacts/2008/rel#photo' type='image/*' href='http://www.google.com/mate/feeds/photos/media/xxxxxxxxxxxxxx%40gmail.com/0'/> 
      <link rel='self' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full/0'/> 
      <link rel='edit' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full/0/1264551117430000'/> 
      <gd:email rel='http://schemas.google.com/g/2005#other' address='[email protected]' primary='true'/> 
     </entry> 
     <entry> 
      <id>http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/base/1</id> 
      <updated>2007-08-01T18:02:04.410Z</updated> 
      <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact'/> 
      <title type='text'></title> 
      <link rel='http://schemas.google.com/contacts/2008/rel#edit-photo' type='image/*' href='http://www.google.com/mate/feeds/photos/media/xxxxxxxxxxxxxx%40gmail.com/1/1B2M2Y8AsgTpgAmY7PhCfg'/> 
      <link rel='self' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full/1'/> 
      <link rel='edit' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full/1/1185991324410001'/> 
      <gd:email rel='http://schemas.google.com/g/2005#other' address='[email protected]' primary='true'/> 
     </entry> 
     <entry> 
      <id>http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/base/2</id> 
      <updated>2010-01-27T00:11:57.430Z</updated> 
      <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact'/> 
      <title type='text'>Steve Sattler</title> 
      <link rel='http://schemas.google.com/contacts/2008/rel#edit-photo' type='image/*' href='http://www.google.com/mate/feeds/photos/media/xxxxxxxxxxxxxx%40gmail.com/2/1B2M2Y8AsgTpgAmY7PhCfg'/> 
      <link rel='self' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full/2'/> 
      <link rel='edit' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full/2/1264551117430000'/> 
      <gd:email rel='http://schemas.google.com/g/2005#other' address='[email protected]' primary='true'/> 
     </entry> 
     <entry> 
      <id>http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/base/3</id> 
      <updated>2010-01-27T00:11:57.430Z</updated> 
      <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact'/> 
      <title type='text'>Michael Montana</title> 
      <link rel='http://schemas.google.com/contacts/2008/rel#edit-photo' type='image/*' href='http://www.google.com/mate/feeds/photos/media/xxxxxxxxxxxxxx%40gmail.com/3/1B2M2Y8AsgTpgAmY7PhCfg'/> 
      <link rel='self' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full/3'/> 
      <link rel='edit' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full/3/1264551117430000'/> 
      <gd:email rel='http://schemas.google.com/g/2005#other' address='[email protected]' primary='true'/> 
     </entry> 
     <entry> 
      <id>http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/base/4</id> 
      <updated>2007-08-01T18:02:04.410Z</updated> 
      <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact'/> 
      <title type='text'></title> 
      <link rel='http://schemas.google.com/contacts/2008/rel#edit-photo' type='image/*' href='http://www.google.com/mate/feeds/photos/media/xxxxxxxxxxxxxx%40gmail.com/4/1B2M2Y8AsgTpgAmY7PhCfg'/> 
      <link rel='self' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full/4'/> 
      <link rel='edit' type='application/atom+xml' href='http://www.google.com/mate/feeds/contacts/xxxxxxxxxxxxxx%40gmail.com/full/4/1185991324410001'/> 
      <gd:email rel='http://schemas.google.com/g/2005#other' address='[email protected]' primary='true'/> 
     </entry> 
    </feed> 

con el código que se parece (esto es el todo del guión (actualmente))

$user = "[email protected]"; 
$password = "xxxxxxxxxxxx"; 

// ref: http://code.google.com/apis/accounts/docs/AuthForInstalledApps.html 

// step 1: login 
$login_url = "https://www.google.com/accounts/ClientLogin"; 
$fields = array(
    'Email' => $user, 
    'Passwd' => $password, 
    'service' => 'cp', // <== contact list service code 
    'source' => 'test-google-contact-grabber', 
    'accountType' => 'GOOGLE', 
); 

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL,$login_url); 
curl_setopt($curl, CURLOPT_POST, 1); 
curl_setopt($curl, CURLOPT_POSTFIELDS,$fields); 
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
$result = curl_exec($curl); 

$returns = array(); 

foreach (explode("\n",$result) as $line) 
{ 
    $line = trim($line); 
    if (!$line) continue; 
    list($k,$v) = explode("=",$line,2); 

    $returns[$k] = $v; 
} 

curl_close($curl); 

// step 2: grab the contact list 
$feed_url = "http://www.google.com/m8/feeds/contacts/$user/full?&max-results=5"; 

$header = array(
    'Authorization: GoogleLogin auth=' . $returns['Auth'], 
); 

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, $feed_url); 
curl_setopt($curl, CURLOPT_HTTPHEADER, $header); 
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 

$result = curl_exec($curl); 
curl_close($curl); 

$doc = new DOMDocument(); 
$doc->load($result); 
$arrFeeds = array(); 
foreach ($doc->getElementsByTagName('entry') as $node) { 
    $monkey = $node->getAttribute('{gd:email}'); 
    $itemRSS = array($monkey->nodeValue); 
array_push($arrFeeds, $itemRSS); 
} 
array_unique($arrFeeds); 

Respuesta

16

Tenga una mirada en DOMDocument y DOMXPath. Para obtener nodos que forman parte de un espacio de nombre particular, como el nodo email que forma parte del espacio de nombres gd, debe registrar el espacio de nombres con el objeto DOMXPath utilizando DOMXPath::registerNamespace(). El URI del espacio de nombre generalmente se puede encontrar en la parte superior del documento XML.

Ejemplo:

$doc = new DOMDocument; 
$doc->recover = true; 
$doc->loadXML($result); 

$xpath = new DOMXPath($doc); 
$xpath->registerNamespace('gd', 'http://schemas.google.com/g/2005'); 

$emails = $xpath->query('//gd:email'); 

foreach ($emails as $email) 
{ 
    echo $email->getAttribute('address'); 

    // To get the title. 
    // This could also be done using XPath. 
    // You can also use ->nodeValue instead of ->textContent. 
    echo $email->parentNode->getElementsByTagName('title')->item(0)->textContent; 
} 

En el ejemplo anterior, $result es el resultado de $result = curl_exec($ch);.

+0

¡Eso es asombroso! No creo que hubiera llegado a esa conclusión por mi cuenta por un buen tiempo al menos. Curioso sin embargo. "// gd: email" ¿qué significa la porción "//"? Como cual es el significado de eso? Luego "$ xpath-> registerNamespace ('gd', 'http://schemas.google.com/g/2005');" ¿Hay alguna manera de no tener el http: // ...... parte porque estoy pensando qué pasa si hay algo diferente ... – chris

+1

@chris - El // solo significa: "Selecciona nodos en el documento del nodo actual que coincide con la selección, sin importar dónde se encuentren ". Para obtener más información, consulte [XPath Syntax en W3Schools.com] (http://www.w3schools.com/xpath/xpath_syntax.asp). El URI del espacio de nombres siempre comienza con el esquema (es decir, http), por lo que debe mantenerse allí. –

+0

Justo antes de responder esto. Me di cuenta de que también quiero obtener el "título" de cada "entrada" para poder poner el nombre de la persona con el correo electrónico. No me di cuenta y mencioné eso en mi publicación original. ¿Hay alguna forma de incorporar esto en esto que has mostrado arriba o la idea tiene que ser reescrita en un contexto diferente para manejar eso? – chris

0
$url = 'https://www.google.com/m8/feeds/contacts//full?max-results='.$max_results.'&oauth_token='.$accesstoken.'&alt=json&updated-min=2007-03-16T00:00:00'; 
function curl_file_get_contents($url) 
{ 

$curl = curl_init(); 
$userAgent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)'; 
//The URL to fetch. This can also be set when initializing a session with curl_init(). 
curl_setopt($curl,CURLOPT_URL,$url);  
curl_setopt($curl, CURLOPT_HTTPHEADER,array('GData-Version: 2.0')); 
curl_setopt($curl,CURLOPT_RETURNTRANSFER,TRUE); //TRUE to return the transfer as a string of the return value of curl_exec() instead of outputting it out directly. 
curl_setopt($curl,CURLOPT_CONNECTTIMEOUT,5); //The number of seconds to wait while trying to connect.  
curl_setopt($curl,CURLOPT_HTTPGET,true); 
curl_setopt($curl, CURLOPT_USERAGENT, $userAgent); //The contents of the "User-Agent: " header to be used in a HTTP request. 
//curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE); //To follow any "Location: " header that the server sends as part of the HTTP header. 
//curl_setopt($curl, CURLOPT_AUTOREFERER, TRUE); //To automatically set the Referer: field in requests where it follows a Location: redirect. 
curl_setopt($curl, CURLOPT_TIMEOUT, 10); //The maximum number of seconds to allow cURL functions to execute. 
//curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); //To stop cURL from verifying the peer's certificate. 

$contents = curl_exec($curl); 

curl_close($curl); 
return $contents; 
}