Php 是否可以将DomeElements大小写折叠起来加载XML文档?

Php 是否可以将DomeElements大小写折叠起来加载XML文档?,php,Php,我正在加载一个带有的XML文档。DomeElement的标记名和属性名似乎没有大小写对应的名称 我需要将XML文档视为不区分大小写,因此这应该被视为无效(名称和名称应该相同,而不是唯一的): 同样,getAttribute/setAttribute函数应该将“NAME”和“NAME”视为同一个属性 似乎通过“XML\u OPTION\u CASE\u FOLDING”常量的函数具有此功能。但DOMDocument和这些函数似乎是互斥的,唯一的相似之处是它们都在幕后使用libxml2 那么,有

我正在加载一个带有的XML文档。DomeElement的标记名和属性名似乎没有大小写对应的名称

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


同样,getAttribute/setAttribute函数应该将“NAME”和“NAME”视为同一个属性

似乎通过“XML\u OPTION\u CASE\u FOLDING”常量的函数具有此功能。但DOMDocument和这些函数似乎是互斥的,唯一的相似之处是它们都在幕后使用libxml2

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


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

我不认为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;
}
函数xml\u case\u fold($string)
{
$string=preg_replace_回调('#()|()#si',
函数($tag)
{
如果($tag[1])
{

$tag[2]=preg_replace_callback('#)([^>我不认为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;
}
函数xml\u case\u fold($string)
{
$string=preg_replace_回调('#()|()#si',
函数($tag)
{
如果($tag[1])
{

$tag[2]=预替换回调('#([^>似乎是朝着正确的方向迈出的一步。我怎么能不接触CDATA元素中的文本呢?添加了几个字符。希望能忽略CDATA标记。不过,我并不真正使用XML-如果你给我指一个典型的文件,我会帮你检查。注意关于使用正则表达式操作XML的常见警告。Tony the pony等。保罗:我是说我喜欢不应该触碰的地方,因为它们位于CDATA块中。不确定正则表达式是否适用于此。cbuckley:有其他策略吗?我也不喜欢使用正则表达式。我这样做是为了所有CDATA都被剥离,然后重新添加(希望未被触碰)。如果你有另一个更简洁的方法,我也会建议你这么做!这似乎是朝着正确方向迈出的一步。我怎么能不接触CDATA元素中的文本?添加了几个字符。希望你能忽略CDATA标记。不过,我并不是真的在使用XML-如果你指给我一个典型的文件,我会帮你检查。注意关于操纵的常见警告ng XML与regex。Tony the pony等:我的意思是不应该触碰的地方,因为它们位于CDATA块中。不确定regex是否能解决这个问题。cbuckley:有其他策略吗?我也不喜欢使用regex。我这样做是为了所有CDATA都被剥离,然后重新添加(希望未被触碰)。如果你有另一个更简洁的方法,我也会建议你!嗯,XSLT可以做到。我看到了一个尝试,我用XSLT做了一些实验。它确实有效,但它剥离了我的CDATA标记并对其中的文本进行了编码。它还剥离了我的DOCTYPE。我相信可能有办法让它工作,但它似乎弄乱了原始文档比DOMDocument做得好。嗯,XSLT可以做到这一点。我看到了一次尝试,我用XSLT做了一些实验。它确实有效,但它剥离了我的CDATA标记并对其中的文本进行了编码。它还剥离了我的DOCTYPE。我相信可能有办法让它工作,但它似乎比DOMDocument更容易弄乱原始文档。