重构XML_Unserializer依赖类以使用DOMDocument

时间:2011-01-19 10:29:50

标签: php xml dom xml-deserialization

我有一个获取此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库。我更喜欢后者,因为它更强大,更灵活,简单的XML带有一些警告。

由于我使用了反序列化器类,因此几乎所有方法都与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 lib,我是否会感谢任何输入,如果是这样,我应该重构所有方法来使用DOM函数或创建数组并保持我的方法不变,为了降低引入新bug的机会?

感谢。

1 个答案:

答案 0 :(得分:0)

我会在你的情况下使用SimpleXML,因为只用很少的改动就可以保持foreach循环。它使用XML比使用PHP的DOM本身更简单。使用它也很容易访问属性。