是否可以加载带有DOMElements的XML文档?

时间:2012-02-01 21:28:22

标签: php

我正在使用DOMDocumentloadXML function加载XML文档。似乎没有任何options个案例折叠DOMElement的tagName和属性名称。

我需要将XML文档视为不区分大小写,因此这应该被认为是无效的(名称和NAME应该相同,而不是唯一的):

<input name="field" NAME="field2" />

同样,getAttribute / setAttribute函数应将“NAME”和“name”视为相同的属性。

xml parser functions似乎通过xml_parser_set_option函数通过“XML_OPTION_CASE_FOLDING”常量具有此功能。但DOMDocument和这些函数似乎是互斥的,唯一的相似之处是他们都在幕后使用libxml2。

那么有没有办法强制DOMDocument进行大小写?使用xml解析器函数的替换是否有任何下降?我希望避免使用任何使用正则表达式的东西。 DOMDocument的吸引力在于对象与程序设计。

通常,XML文档节点应该是小写的。但是我希望我的代码仍能正常工作,如果有人大写某些内容并在解析文档后将其转换为小写。

1 个答案:

答案 0 :(得分:1)

我认为在DomDocument类中没有一个特定的函数来忽略大小写(或重复数据删除属性),但是你可以在加载它之前降低相关XML部分的大小写以获得一些那边的路?

function xml_case_fold($string)
{
    $string = preg_replace_callback('#(</?[^!><= ]+)([^><]*>)|(<!\[CDATA\[)(.*\]\]>)#si',
        function($tag)
        {
            if($tag[1])
            {
                $tag[2] = preg_replace_callback('#([^><= ]+)(=(["\']).*?\3)#s',
                        function($attr)
                        {
                            return strtolower($attr[1]) . $attr[2];
                        }, $tag[2]);

                return strtolower($tag[1]) . $tag[2];
            }
            else
            {
                return $tag[0];
            }
        }, $string);

    return $string;
}