2010-01-12 4 views
1

J'ai une classe qui étend PDO pour lui donner la possibilité de tirer la configuration d'un fichier xml. Malheureusement, notre fournisseur d'hébergement a désactivé SimpleXML, j'ai donc besoin de refactoriser mon code pour utiliser Dom, qui est disponible.Portage code qui a utilisé SimpleXML à Dom en PHP

J'utilise le code suivant:

class xmlPDO extends PDO 
{ 
    public function __construct($xml_uri){ 
     $xml = simplexml_load_file($xml_uri); 
     $dsn_template = "%s:host=%s; dbname=%s"; 
     $dsn = sprintf($dsn_template, $xml->dsn->driver, $xml->dsn->host, $xml->dsn->dbname); 
     parent::__construct($dsn, $xml->username, $xml->password); 
    } 
} 

Pour lire le code XML suivant:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE database [ 
<!ELEMENT database (name, description, dsn, username, password)> 
    <!ELEMENT name (#PCDATA)> 
    <!ELEMENT description (#PCDATA)> 
    <!ELEMENT dsn (driver, dbname, host)> 
     <!ELEMENT driver (#PCDATA)> 
     <!ELEMENT dbname (#PCDATA)> 
     <!ELEMENT host (#PCDATA)> 
    <!ELEMENT username (#PCDATA)> 
    <!ELEMENT password (#PCDATA)> 
]> 

<database> 
    <name>Test Database</name> 
    <description>Localhost test database, use only for testing</description> 
    <dsn> 
     <driver>mysql</driver> 
     <dbname>test</dbname> 
     <host>localhost</host> 
    </dsn> 
    <username>user</username> 
    <password>test</password> 
</database> 

Je cherche la documentation de php.net et ai vraiment du mal à essayer de comprendre comment je suis censé faire cela. Je ne peux pas donner l'exemple d'un code clair pour extraire des données comme celle-ci.

+0

essayez-vous toujours de le porter? avez-vous essayé l'une des réponses? –

Répondre

0

Ou je pouvais utiliser la classe simple xml for php 4 qui se comporte à peu près aussi simple xml, mais fonctionne-xml simple désactivé.

0

Puisque vous avez déjà une configuration DTD la esiest chose à faire serait d'ajouter et IDENTITY attribuer aux différentes balises, puis utilisez getElementById

Si vous ne l'esprit toujours traiter avec des collections nodelist vous pouvez toujours utiliser getElementsByTagName.

Sinon, vous devez utiliser les fonctions de traversée et les propriétés des éléments (nextSibling, prevSibling, childNodes) pour parcourir le DOM. Vous pouvez également utiliser des requêtes xpath qui simplifieraient simplement la traversée.

2

Est-ce que votre fournisseur d'hébergement a désactivé SimpleXML, ou a simplement désactivé la capacité de SimpleXML à charger des fichiers à partir d'URL? Ce dernier est beaucoup plus commun que le premier, et si c'est le dernier document Dom peut subir le même sort. Avant de plonger trop profondément dans DomDocument, qui est une API robuste et mal documentée, essayez d'utiliser les fonctions curl pour télécharger votre XML, puis utilisez simplexml_load_string pour créer votre objet SimpleXML.

Si vous devez utiliser la route DomDocument, vous voulez search around for xpath tutorials. C'est la manière la plus directe d'extraire des informations d'un objet DomDocument.

+1

xpath, bien sûr, est connu pour sa simplicité. – Dereleased

+0

Non, simplexml est désavoué avec --disable-simplexml –

2
<?php 

$dom = new DOMDocument(); 
$dom->load('file.xml'); 
$xp = new DOMXpath($dom); 

$username = $xp->evaluate('//username'); 
$password = $xp->evaluate('//password'); 

if ($username->length > 0) { 
    echo $username->item(0)->nodeValue; 
} 

if ($password->length > 0) { 
    echo $password->item(0)->nodeValue; 
}