Поскольку GMail позволил импортировать и экспортировать фильтры почты, я хотел бы управлять XML-файлами, которые экспортируются из GMail с использованием PHP-скрипта, так как есть некоторые известные проблемы с количеством символов в фильтрах поиска.
Я нашел функцию simplexml_load_file в PHP и выполнил var_dump () против выполняемого экспорта, но теперь я, похоже, не могу получить доступ к пространству имен приложений в сгенерированном XML-файле.
Следуя различным страницам руководства PHP, я создал этот очень простой скрипт для чтения XML-файла, поэтому я могу начать обработку фильтров, которые я уже создал. К сожалению, кажется, что отсутствуют ключевые части!
<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"); } ?></pre>
Это возвращает эти данные (извлечения)
["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=''/>
Джон,
Полные оценки для связывания этого с Facebook, я бы никогда не видел его иначе, и я делал ТОЧНО это вчера, для службы google! Я думаю, что использование XPath – это немного красная селедка, позвольте мне показать вам, как получить доступ к элементам, и, надеюсь, это даст вам достаточно информации о том, что вы хотите сделать.
Вы находитесь на правильных дорожках с помощью $ xml-> getNamespaces () – но не итерации там, вам нужно использовать пространство имен, которое вы хотите, на родительский элемент, который вы хотите. Во-первых, вам нужно работать только с элементами входа, так как это большинство, вы также можете использовать цикл и проверить, есть ли у вас правильный:
foreach($xml as $tag) { if($tag->getName() == "entry") { // awesome, do Cool Stuff (TM) here } }
Теперь у вас есть элемент в переменной $ tag, и вы хотите, чтобы приложения: дочерние элементы с именами. Так сделайте так:
$tag->getChildren($namespaces['apps']);
Когда вы перебираете эту коллекцию, вы увидите нужную вам информацию.
НТН,
Лорна
У меня недавно была аналогичная «проблема». Я пытался получить настройки электронной почты в Google Apps. Вот как выглядит 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>
Мне не удалось получить атрибуты из приложений: свойство, использующее 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'];