沃梦达 / 编程问答 / php问题 / 正文

PHP GMAIL 联系人 XML 解析与 DOMDocument 和 cURL

PHP GMAIL Contacts XML Parsing with DOMDocument and cURL(PHP GMAIL 联系人 XML 解析与 DOMDocument 和 cURL)

本文介绍了PHP GMAIL 联系人 XML 解析与 DOMDocument 和 cURL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前想要获得的只是 gd:email 的属性,即address=",目前仅此而已.我可以进入 xml 部分,哎呀,只要它在标签内,我什至可以得到任何给定的想法,但要获得任何给定的属性,就像我的情况一样.我完全糊涂了.我曾经知道如何去做,但我已经很久没有做过任何对 XML 使用不简单的事情了.所以我把自己搞砸了..

What I am trying to get currently is just the attribute of gd:email that is the "address=" only nothing else as of the moment. Which I can get to the xml portion, heck I can even get any given think per say as long as its within tags like but to get the attribute of any given one like in my case.. I am completely confused on. I used to know how to do it but its been so long since I did anything that wasn't simple for XML useage. so I done messed my own self up..

<?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>xxxxxxxxxxxxxx@gmail.com</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>xxxxxxxxxxxxxx@gmail.com</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='xxxxxxxxxxxxxx@gmail.com' 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='xxxxxxxxxxxxxx@sbcglobal.net' 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='xxxxxxxxxxxxxx@yahoo.com' 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='xxxxxxxxxxxxxx@comcast.net' 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='xxxxxxxxxxxxxx@courant.com' primary='true'/>
        </entry>
    </feed>

代码看起来像(这是整个脚本(当前))

with code that looks like (this is the whole script (currently))

$user = "xxxxxxxxxxxxxxxxxxx@gmail.com";
$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("
",$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);

推荐答案

看看DOMDocumentDOMXPath.为了获取属于特定命名空间一部分的节点,例如属于 gd 命名空间的 email 节点,您需要使用 注册命名空间DOMXPath 对象使用 DOMXPath::registerNamespace().命名空间 URI 通常位于 XML 文档的顶部.

Have a look at DOMDocument and DOMXPath. In order to get nodes that are part of a particular namespace, like the email node which is part of the gd namespace, you need to register the namespace with the DOMXPath object using DOMXPath::registerNamespace(). The namespace URI can usually be found at the top of the XML document.

示例:

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

在上面的例子中,$result$result = curl_exec($ch); 的结果.

In the example above, $result is the result of $result = curl_exec($ch);.

这篇关于PHP GMAIL 联系人 XML 解析与 DOMDocument 和 cURL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:PHP GMAIL 联系人 XML 解析与 DOMDocument 和 cURL

基础教程推荐