Портирование кода, который использовал SimpleXML для Dom в PHP - PullRequest
1 голос
/ 12 января 2010

У меня есть класс, который расширяет PDO, чтобы дать ему возможность извлекать конфигурацию из XML-файла. К сожалению, наш хостинг-провайдер отключил SimpleXML, поэтому мне нужно реорганизовать мой код, чтобы использовать Dom, который доступен.

Я использую следующий код:

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);
    }
}

Чтобы прочитать следующий XML:

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

Я просматриваю документацию php.net, и мне очень трудно понять, как я должен это делать. Кажется, я не могу привести четкие примеры кода для извлечения таких данных.

Ответы [ 4 ]

2 голосов
/ 12 января 2010

Ваш хостинг-провайдер отключил SimpleXML или просто отключил возможность SimpleXML загружать файлы с URL-адресов? Последнее гораздо более распространено, чем первое, и если это более поздний вариант, DomDocument может постигнуть та же участь.

Прежде чем вы углубитесь в DomDocument, который представляет собой надежный и плохо документированный API, попробуйте использовать функции curl для загрузки вашего XML, а затем используйте simplexml_load_string для создания объекта SimpleXML.

Если вам в конечном итоге придется идти по пути DomDocument, вы хотите поискать учебники по xpath . Это самый простой способ получить информацию из объекта DomDocument.

2 голосов
/ 12 января 2010
<?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;
}
0 голосов
/ 05 февраля 2010

Или я мог бы использовать simple xml для класса php 4 , который ведет себя почти так же, как простой xml, но работает, когда simple-xml отключен.

0 голосов
/ 12 января 2010

Поскольку у вас уже есть настройка DTD, самое простое, что вам нужно сделать, это добавить атрибут IDENTITY к различным тегам и затем использовать getElementById

Если вы не против всегда иметь дело с коллекциями нодлистов, вы всегда можете использовать getElementsByTagName.

В противном случае вы должны использовать функции обхода и свойства элемента (nextSibling, prevSibling, childNodes) для обхода DOM. Вы также можете использовать xpath-запросы, которые просто обойдут путь.

...