PHP-класс-оболочка для XML - PullRequest
0 голосов
/ 06 апреля 2010

Я работаю над новым классом для обработки XML. Я хочу, чтобы мой класс использовал simplexml, если он установлен, и встроенные функции XML, если это не так. Кто-нибудь может дать мне несколько советов по скелетону? Кажется "неправильным" засорять каждый метод кучей операторов if, и это также, похоже, делает почти невозможным правильное тестирование.

Любые предварительные предложения будут великолепны!

РЕДАКТИРОВАТЬ : я говорю о этих встроенных функциях XML .

Ответы [ 3 ]

1 голос
/ 07 апреля 2010

Я создал класс, который обёртывает функциональность SimpleXml ... возьми что угодно из него ...

bXml.class.inc

Есть одна странная вещь ... это то, что SimpleXml не позволяет перегружать его конструктор, поэтому вы не можете делать что-либо при инициализации ... как переопределить входное значение (то есть, чтобы вы могли принять XML как в вход). Я обошел это ограничение, используя класс ArrayObject, чтобы обернуть новый класс SimpleXml.

1 голос
/ 06 апреля 2010

На какие встроенные функции xml вы ссылаетесь? SimpleXml - это стандартное расширение, которое использует libxml снизу - так же, как расширение dom. Так что, если расширение dom установлено, скорее всего, так же, как SimpleXml.

0 голосов
/ 06 апреля 2010

Я использую что-то вроде этого для выполнения XML-переводов и контента:

Предполагая, что XML-структура похожа на эту (важно использовать обычную структуру, это означает, что вы можете выполнить несколько хороших гибких трюков!)

<word name="nameofitem">
    <en>value</en>
    <pt>valor</pt>
    <de>value_de</de>
</word>

а затем класс для обработки xml:

class translations
{

    public $xml = null;

    private $file = null;
    private $dom = null;



    function __construct($file="translations")  {
        // get xml

        $this->file = $file;

        $this->haschanges = false;

        $this->xml = file_get_contents($_SERVER['DOCUMENT_ROOT']."/xml/".$file.".xml");
        $this->dom = new DOMdocument();

        $this->dom->loadXML($this->xml);
    }

    function updateNode($toupdate, $newvalue, $lang="pt",$rootnode="word"){

        $this->haschanges = true;

        $nodes = $this->dom->getElementsByTagName($rootnode);
        foreach ($nodes as $key => $value) {
            if ($value->getAttribute("name")==$toupdate) {

                $nodes->item($key)->getElementsByTagName($lang)->item(0)->nodeValue = htmlspecialchars($newvalue,ENT_QUOTES,'UTF-8');
            }
        }
    }


    function saveUpdated(){
        $toSave =  $this->dom->saveXML();
        if ($this->haschanges === true) {
            file_put_contents($_SERVER['DOCUMENT_ROOT']."/xml/".$this->file.".xml", $toSave);
            return true;
        }
        else {
            return false;
        }
    }

}

Для краткости я взял несколько методов, которые у меня есть, но я дополню их вещами для обработки загрузки файлов и изображений и т. Д.

Когда у вас есть все это, вы можете сделать:

$xml = new translations();
    // loop through all the language posts
    foreach ($_POST["xml"]["en"] as $key => $value) {
        $xml->updateNode($key, stripslashes($value), "en");
    }

Или что-то;) надеюсь, это даст вам некоторые идеи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...