在PHP中将使用SimpleXML的代码移植到Dom

在PHP中将使用SimpleXML的代码移植到Dom,php,dom,refactoring,simplexml,Php,Dom,Refactoring,Simplexml,我有一个扩展PDO的类,使其能够从xml文件中提取配置。不幸的是,我们的托管提供商已经禁用了SimpleXML,因此我需要重构代码以使用Dom,而Dom是可用的 我正在使用以下代码: class xmlPDO extends PDO { public function __construct($xml_uri){ $xml = simplexml_load_file($xml_uri); $dsn_template = "%s:host=%s; dbnam

我有一个扩展PDO的类,使其能够从xml文件中提取配置。不幸的是,我们的托管提供商已经禁用了SimpleXML,因此我需要重构代码以使用Dom,而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文档,并且很难弄清楚我应该如何做到这一点。我似乎无法提供任何清晰的代码示例来提取这样的数据。

因为您已经有了DTD设置,所以最需要做的就是向各种标记添加和标识属性,然后使用getElementById

如果您不介意总是处理nodelist集合,那么您可以始终使用getElementsByTagName


否则,必须使用遍历函数和元素属性nextSibling、previssibling、childNodes来遍历DOM。您还可以使用xpath查询,这将简化遍历。

因为您已经有了DTD设置,所以最需要做的事情是向各种标记添加和标识属性,然后使用getElementById

如果您不介意总是处理nodelist集合,那么您可以始终使用getElementsByTagName


否则,必须使用遍历函数和元素属性nextSibling、previssibling、childNodes来遍历DOM。您还可以使用xpath查询,这将简化遍历。

您的宿主提供程序是否禁用了SimpleXML,或者您刚刚禁用了SimpleXML从URL加载文件的功能?后者比前者普遍得多,如果是后者,后者也可能遭受同样的命运

在深入研究DomDocument之前,请尝试使用curl函数下载XML,然后使用创建SimpleXML对象。DomDocument是一个健壮的、没有很好文档记录的API


如果您最终不得不走DomDocument路线,那么您需要这样做。这是从DomDocument对象中获取信息的最直接的方法。

您的宿主提供商是否禁用了SimpleXML,或者您刚刚禁用了SimpleXML从URL加载文件的功能?后者比前者普遍得多,如果是后者,后者也可能遭受同样的命运

<?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;
}
在深入研究DomDocument之前,请尝试使用curl函数下载XML,然后使用创建SimpleXML对象。DomDocument是一个健壮的、没有很好文档记录的API


如果您最终不得不走DomDocument路线,那么您需要这样做。这是从DomDocument对象获取信息的最直接的方法。

或者我可以使用行为类似于简单xml但在禁用简单xml时工作的类。

或者我可以使用行为类似于简单xml但在禁用简单xml时工作的类。

,simplexml被-disable simplexml禁用Nope,simplexml被-disable simplexml禁用你还在尝试移植它吗?你试过任何一个答案吗?你还在尝试移植吗?你试过任何答案吗?
<?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;
}