Использование PHP для управления XML-файлами GMail Mail Filter - PullRequest
2 голосов
/ 28 октября 2010

Поскольку GMail позволил импортировать и экспортировать почтовые фильтры, я бы хотел управлять XML-файлами, которые экспортируются из GMail, с помощью PHP-скрипта, так как существуют некоторые известные проблемы с числом символов в фильтрах поиска.

Я нашел функцию simplexml_load_file в PHP и выполнил var_dump () для выполненного экспорта, но теперь я не могу получить доступ к пространству имен приложений в сгенерированном файле XML.

Следуя различным страницам руководства по PHP, я создал этот очень простой скрипт для чтения XML, чтобы я мог начать обрабатывать фильтры, которые я уже создал. К сожалению, кажется, что отсутствуют ключевые части!

<code><pre><?php

if(file_exists("mailfilters.xml")) {
  $xml = simplexml_load_file("mailfilters.xml");
  $namespaces = $xml->getNamespaces(true);
  foreach ($namespaces as $prefix => $ns) {
      $xml->registerXPathNamespace($prefix, $ns);
  }
  var_dump($xml);
} else {
  die("Failed to open filter file");
}

?>

Возвращает эти данные (извлечение)

["entry"]=>
array(268) {
  [0]=>
  object(SimpleXMLElement)#3 (5) {
    ["category"]=>
    object(SimpleXMLElement)#271 (1) {
      ["@attributes"]=>
      array(1) {
        ["term"]=>
        string(6) "filter"
      }
    }
    ["title"]=>
    string(11) "Mail Filter"
    ["id"]=>
    string(45) "tag:mail.google.com,2008:filter:1284991916868"
    ["updated"]=>
    string(20) "2010-10-28T11:59:31Z"
    ["content"]=>
    object(SimpleXMLElement)#272 (0) {
    }
  }
  [1]=>
  object(SimpleXMLElement)#4 (5) {
    ["category"]=>
    object(SimpleXMLElement)#272 (1) {
      ["@attributes"]=>
      array(1) {
        ["term"]=>
        string(6) "filter"
      }
    }
    ["title"]=>
    string(11) "Mail Filter"
    ["id"]=>
    string(45) "tag:mail.google.com,2008:filter:1284991925003"
    ["updated"]=>
    string(20) "2010-10-28T11:59:31Z"
    ["content"]=>
    object(SimpleXMLElement)#271 (0) {
    }
  }

Вот выдержка из файла XML, который я скачал сегодня, использованного для создания вышеприведенного вывода:

<?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:apps='http://schemas.google.com/apps/2006'>
    <title>Mail Filters</title>
<id>tag:mail.google.com,2008:filters:1284991916868,...,1287734777820</id>
<updated>2010-10-28T11:59:31Z</updated>
<author>
    <name>My Name</name>
    <email>my@email.addr.es</email>
</author>
<entry>
    <category term='filter'></category>
    <title>Mail Filter</title>
    <id>tag:mail.google.com,2008:filter:1284991916868</id>
    <updated>2010-10-28T11:59:31Z</updated>
    <content></content>
    <apps:property name='from' value='an@email.addr.es'/>
    <apps:property name='shouldArchive' value='true'/>
    <apps:property name='shouldTrash' value='true'/>
</entry>
<entry>
    <category term='filter'></category>
    <title>Mail Filter</title>
    <id>tag:mail.google.com,2008:filter:1284993579743</id>
    <updated>2010-10-28T11:59:31Z</updated>
    <content></content>
    <apps:property name='subject' value='Some Relevant Subject'/>
    <apps:property name='label' value='MyCoolLabel'/>
    <apps:property name='shouldArchive' value='true'/>
</entry>

Другие глаголы "apps: property" включают:

<apps:property name='hasTheWord' value=''/>
<apps:property name='shouldAlwaysMarkAsImportant' value=''/>
<apps:property name='doesNotHaveTheWord' value=''/>

Ответы [ 2 ]

2 голосов
/ 03 сентября 2012

У меня недавно была похожая "проблема".Я пытался получить настройки подписи электронной почты из Служб Google.Вот как выглядит XML-ответ от Google:

<?xml version='1.0' encoding='UTF-8'?>
<entry xmlns='http://www.w3.org/2005/Atom' xmlns:apps='http://schemas.google.com/apps/2006'>
<id>https://apps-apis.google.com/a/feeds/emailsettings/2.0/domain.com/user/signature</id>
<updated>2012-08-31T15:22:03.067Z</updated>
<link rel='self' type='application/atom+xml' href='https://apps-apis.google.com/a/feeds/emailsettings/2.0/domain.com/user/signature?xoauth_requestor_id=user@domain.com'/>
<link rel='edit' type='application/atom+xml' href='https://apps-apis.google.com/a/feeds/emailsettings/2.0/domain.com/user/signature?xoauth_requestor_id=user@domain.com'/>
<apps:property name='signature' value='Here goes the email signature...'/>
</entry>

Мне не удалось получить атрибуты из приложения apps: свойство с использованием SimpleXMLElement.Вот как я наконец решил это:

    // create SimpleXMLElement with XML input as string
    $xml = new SimpleXMLElement($feed);

    // get namespace from XML
    $namespaces = $xml->getNamespaces(true);

    // get children (using namespace) and attributes
    $appsProperty = $xml->children($namespaces['apps'])->attributes();

    // attributes are now stored in array $appsProperty and can be accessed
    echo "Name: ".$appsProperty['name'];
    echo "Signature: ".$appsProperty['value'];
1 голос
/ 29 октября 2010

Джон,

Полные оценки за ссылку на это с Facebook, я бы никогда не увидел это иначе, и я делал именно это вчера, для службы Google! Я думаю, что использование XPath - это что-то вроде красной сельди, позвольте мне показать вам, как получить доступ к элементам, и, надеюсь, он даст вам достаточно информации для того, что вы хотите сделать.

Вы идете по правильному пути с помощью $ xml-> getNamespaces () - но не выполняйте итерации, вам нужно использовать желаемое пространство имен для родительского элемента, который вы хотите. Во-первых, вам нужно работать только с элементами ввода, так как их большинство, вы можете также зациклить и проверить, есть ли у вас правильный:

foreach($xml as $tag) {
  if($tag->getName() == "entry") {
    // awesome, do Cool Stuff (TM) here
  }
}

Теперь у вас есть элемент в переменной $ tag, и вы хотите дочерние элементы apps: namespaced. Так что сделайте это:

$tag->getChildren($namespaces['apps']);

Когда вы перебираете эту коллекцию, вы увидите нужную информацию.

НТН,

Лорна

...