2010-06-08 10 views
1

J'essaie d'écrire un analyseur pour un programme d'écoute de publication xml, mais je n'arrive pas à l'obtenir pour vider le fichier xml d'un échantillon. Le gars du support de l'API m'a dit d'utiliser 'DOMDocument', peut-être 'SimpleXML'? Quoi qu'il en soit, voici le code: (merci!)Vidangez les messages XML de 'php: // input' vers le fichier

<?php 
$xml_document = file_get_contents('php://input'); 
$doc = new DOMDocument(); 
$doc->loadXML($xml_document); 
$doc->save("test2/".time().".sample.xml").".xml"); 
?> 
+1

$ doc-> save ("test2 /" time() "sample.xml."..). ".xml"); Cela semble avoir un supplément) dedans. –

+0

Il semble également à partir de cet exemple de code que vous essayez de lire à partir de STDIN, puis de traiter le document XML, puis l'enregistrer? Ne pouvez-vous pas lire à partir de STDIN (php: // input) et enregistrer directement dans un fichier? –

Répondre

2

Comment l'utiliser pour créer un fichier XML?

/** 
* Will output in a similar form to print_r, but the nodes are xml so can be collapsed in browsers 
* 
* @param mixed $mixed 
*/ 
function print_r_xml($mixed) 
{ 
    // capture the output of print_r 
    $out = print_r($mixed, true); 

    // Replace the root item with a struct 
    // MATCH : '<start>element<newline> (' 
    $root_pattern = '/[ \t]*([a-z0-9 \t_]+)\n[ \t]*\(/i'; 
    $root_replace_pattern = '<struct name="root" type="\\1">'; 
    $out = preg_replace($root_pattern, $root_replace_pattern, $out, 1); 

    // Replace array and object items structs 
    // MATCH : '[element] => <newline> (' 
    $struct_pattern = '/[ \t]*\[([^\]]+)\][ \t]*\=\>[ \t]*([a-z0-9 \t_]+)\n[ \t]*\(/miU'; 
    $struct_replace_pattern = '<struct name="\\1" type="\\2">'; 
    $out = preg_replace($struct_pattern, $struct_replace_pattern, $out); 
    // replace ')' on its own on a new line (surrounded by whitespace is ok) with '</var> 
    $out = preg_replace('/^\s*\)\s*$/m', '</struct>', $out); 

    // Replace simple key=>values with vars 
    // MATCH : '[element] => value<newline>' 
    $var_pattern = '/[ \t]*\[([^\]]+)\][ \t]*\=\>[ \t]*([a-z0-9 \t_\S]+)/i'; 
    $var_replace_pattern = '<var name="\\1">\\2</var>'; 
    $out = preg_replace($var_pattern, $var_replace_pattern, $out); 

    $out = trim($out); 
    $out='<?xml version="1.0"?><data>'.$out.'</data>'; 

    return $out; 
} 

Im ma demande j'ai posté tous les $ _POST à ​​elle:

$handle = fopen("data.xml", "w+"); 
$content = print_r_xml($_POST); 
fwrite($handle,$content); 
fclose(); 
+0

merci Kieran! J'ai essayé votre méthode pour déverser des données de poste dans un fichier xml, mais cela n'a pas fonctionné. Est-ce que cela échouerait parce que les données sont déjà affichées en XML? – Mikey1980

+0

Selon l'autre commentaire sur le poste, ne pourriez-vous pas alors enregistrer cette entrée dans un fichier? –

+0

Je devais utiliser "php: // input" au lieu de $ _POST - c'était un problème de cert SSL pourquoi les messages XML échouaient-ya je peux juste le sauvegarder mais je vais analyser des éléments à un moment donné. – Mikey1980