Рефакторинг зависимого класса XML_Unserializer для использования DOMDocument - PullRequest
1 голос
/ 19 января 2011

У меня есть класс, который принимает этот XML-файл:

<?xml version="1.0" encoding="utf-8" ?> 
    <pagedata> 
        <language>en-es</language> 
        <meta> 
            <![CDATA[
            <title>web page</title>
            ]]>
        </meta> 
        <pagecontent> 
            <class>test</class> 
                </pagecontent>
         </pagedata>

И использует XML_Unserializer для преобразования его в массив.Это становится:

Array
(
    [language] => en-US
    [meta] => <title></title> 
    [pagecontent] => Array
        (
            [class] => test
)

У меня есть методы, которые возвращают значения ключей в массиве.Так, например, если бы я хотел язык, я бы использовал $class->getData('language') или $class->getData('pagecontent:class').

Мы больше не поддерживаем PHP4, поэтому я могу теперь полагаться на нативные реализации XML.Я работал как с SimpleXML, так и со стандартной библиотекой php DOM.Я предпочитаю последнее, так как оно более мощное и гибкое, а simpleXML поставляется с некоторыми оговорками.

Поскольку я использовал класс unserializer, почти все мои методы взаимодействуют с методами функций, такими как foreach.Мне интересно, стоит ли сохранять массив, что избавило бы меня от рефакторинга всех моих методов?Кроме того, я знаю, что иногда бывает сложно захватить весь nodeValue элемента, потому что тогда вам нужно реализовать такие методы, как:

function innerHTML($node){
  $doc = new DOMDocument();
  foreach ($node->childNodes as $child)
    $doc->appendChild($doc->importNode($child, true));

  return $doc->saveHTML();
}

И использование этого метода кажется неэффективным много раз, так каквсегда создает DOMDocument.Я мог бы, вероятно, реорганизовать метод, чтобы он снова и снова использовал один и тот же DOMDocument и добавлял фрагменты, но это кажется излишним.

Я был бы признателен за любой вклад в этот способ, с точки зрения того, должен ли я даже использовать стандартную библиотеку DOMи если да, я должен реорганизовать все мои методы, чтобы использовать функции DOM или создать массив и оставить мои методы такими, какие они есть, чтобы снизить вероятность появления новых ошибок?

Спасибо.

1 Ответ

0 голосов
/ 25 апреля 2011

Я бы использовал SimpleXML в вашем случае, поскольку можно сохранить циклы foreach только с несколькими изменениями.Это делает использование XML проще, чем использование самого DOM PHP.Доступ к атрибутам также прост с ним.

...