2010-10-28 11 views
2

Depuis GMail a permis d'importer et d'exporter les filtres de messagerie, je voudrais gérer les fichiers XML qui sont exportés à partir de GMail en utilisant un script PHP, car il y a quelques known issues avec le nombre de caractères dans les filtres de recherche. J'ai trouvé la fonction simplexml_load_file dans PHP, et j'ai exécuté var_dump() par rapport à l'exportation effectuée, mais je ne semble pas pouvoir accéder à l'espace de noms des applications dans le fichier XML généré. Suite à diverses pages dans le manuel PHP, j'ai créé ce script très simple pour lire le code XML afin que je puisse commencer à traiter les filtres que j'ai déjà créés. Malheureusement, il semble manquer les parties clés!Utiliser PHP pour gérer les fichiers XML de GMail Mail Filter

<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> 

Cela renvoie ces données (extrait)

["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) { 
    } 
    } 

Voici un extrait du fichier XML que j'ai téléchargé aujourd'hui, utilisé pour créer la sortie ci-dessus:

<?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>[email protected]</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='[email protected]'/> 
    <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> 

Autres « applications : verbe "propriété":

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

Quelle est la question? En tant que mineur, obtenir les déclarations d'espaces de noms de la source d'entrée de cette manière n'est pas pratique. Vous devez connaître votre schéma d'entrée à l'avance et ajouter l'URI d'espaces de noms aux liaisons de préfixes en conséquence. –

+0

Je ne vois pas comment cela est même légèrement lié à XPath ??? –

+0

Merci Dimitre - Je remarque que quelqu'un a supprimé la balise xpath.Désolé, je suis assez nouveau pour simplexml, et je pensais que les deux étaient entrelacés! – JonTheNiceGuy

Répondre

1

Jon,

Les pleins points pour lier ceci à Facebook, je ne l'aurais jamais vu autrement et je faisais EXACTEMENT ceci hier, pour un service de google! Je pense que l'utilisation de XPath est un peu un hareng rouge, laissez-moi vous montrer comment accéder aux éléments et j'espère que cela vous donnera assez d'informations pour ce que vous voulez faire.

Vous êtes sur la bonne voie avec $ xml-> getNamespaces() - mais ne pas itérer là, vous devez utiliser l'espace de noms que vous voulez sur l'élément parent que vous voulez. Tout d'abord, vous devez travailler uniquement sur les éléments d'entrée, puisque ceux-ci sont la majorité, vous pourriez boucle aussi bien et vérifier si vous avez la bonne:

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

Maintenant, vous avez l'élément dans la variable $ tag , et vous voulez les applications: éléments enfants namespaced. Donc, faites ceci:

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

Lorsque vous parcourez cette collection, vous verrez les informations que vous vouliez.

HTH,

Lorna

+0

J'ai donné un tourbillon, et j'ai trouvé que $ tag-> children ('apps', TRUE) pour accéder aux données que je recherchais, et ensuite, comme vous l'avez dit, itérer sur ces données ($ children = $ tag- > children ... as $ child), puis extrayez les données avec $ child-> attributes(). Merci Lorna! – JonTheNiceGuy

2

J'ai eu récemment un "problème" similaire. J'essayais d'obtenir les paramètres de signature de messagerie de Google Apps. C'est ce que la réponse XML de Google ressemble à:

<?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/[email protected]'/> 
<link rel='edit' type='application/atom+xml' href='https://apps-apis.google.com/a/feeds/emailsettings/2.0/domain.com/user/[email protected]'/> 
<apps:property name='signature' value='Here goes the email signature...'/> 
</entry> 

je ne pouvais l'obtenir les attributs sur les applications: en utilisant la propriété SimpleXMLElement. Voici comment je l'ai finalement résolu:

// 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'];