2011-06-30 12 views
7

To, co próbuję uzyskać obecnie, to po prostu atrybut gd: e-mail, który jest "adresem =", nic innego jak tylko w danym momencie. Które mogę dostać do części xml, do cholery Mogę nawet dostać jakąkolwiek myśl na powiedzenie tak długo, jak jego wewnątrz tagów, ale, aby uzyskać atrybut dowolnego takiego jak w moim przypadku .. Jestem całkowicie zdezorientowany. Kiedyś wiedziałem, jak to zrobić, ale było tak dawno, odkąd zrobiłem coś, co nie było proste do wykorzystania XML. tak zrobiłem pomieszane moje własne poczucie up ..PHP GMAIL Kontakt XML Parsowanie z DOMDocument i 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> 

z kodem, który wygląda jak (jest to cały skrypt (obecnie))

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

Odpowiedz

16

Wystarczy popatrzeć na DOMDocument i DOMXPath. Aby uzyskać węzły należące do określonej przestrzeni nazw, takie jak węzeł email, który jest częścią przestrzeni nazw , należy zarejestrować przestrzeń nazw za pomocą obiektu DOMXPath przy użyciu DOMXPath::registerNamespace(). Identyfikator URI przestrzeni nazw zwykle znajduje się u góry dokumentu XML.

przykład:

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

W powyższym przykładzie $result jest wynikiem $result = curl_exec($ch);.

+0

To jest niesamowite! Nie sądzę, bym sam doszedł do takiego wniosku przynajmniej na jakiś czas. Ale ciekawy. "// gd: email" Co oznacza część "//"? Jak to ma znaczenie? Następnie "$ xpath-> registerNamespace (" gd "," http://schemas.google.com/g/2005 ");" jest tak, aby nie mieć części http: // ...... ponieważ im myślę co jeśli tam jest coś innego .. – chris

+1

@chris - // oznacza tylko: "Wybiera węzły w dokumencie z bieżącego węzła, który dopasuj wybór niezależnie od tego, gdzie się znajdują ". Aby uzyskać więcej informacji, zobacz [Składnia XPath na stronie W3Schools.com] (http://www.w3schools.com/xpath/xpath_syntax.asp). Identyfikator URI przestrzeni nazw zawsze zaczyna się od schematu (tj. Http), więc musisz tam pozostać. –

+0

Tuż przed udzieleniem odpowiedzi. Zdałem sobie sprawę, że chcę również uzyskać "tytuł" każdego "wpisu", aby móc umieścić nazwisko osoby z adresem e-mail. Nie udało mi się zrealizować i wspomnieć o tym w moim oryginalnym wpisie. Czy istnieje sposób, w jaki mogę to włączyć do tego, co pokazaliście powyżej, czy pomysł musi zostać przepisany w innym kontekście, aby temu zaradzić? – 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; 
}