【发布时间】:2013-02-19 19:40:50
【问题描述】:
我最近对 XML 命名空间感到非常痛苦,并在 PHP 中有效地处理它们。这是最坏的罪魁祸首的示例:
<dc:type xsi:type="TypeName" xsi:identifier="NN">Others</dc:type>
我使用 preg_replace 成功地做到的是使用以下方法“取消命名空间”标签(不破坏 URL):
$xml = preg_replace(
'/<(\/?)([^:" ].*):([^>\/ ].*)(\/?)>/msiU',
'<$1$2_$3$4>',
$x->readOuterXML()
);
# <dc_type xsi:type="TypeName" xsi:identifier="NN">Others</dc_type>
由于缺少正则表达式魔法,我无法将所有命名空间属性转换为相同的格式。我设法转换了第一次出现,但不知道如何设置可重复的条件。我删除了代码,因为它不起作用(我不记得我做了什么),但结果是这样的:
<dc_type xsi_type="TypeName" xsi:identifier="NN">Others</dc_type>
而美丽的是这样:
<dc_type xsi_type="TypeName" xsi_identifier="NN">Others</dc_type>
有没有正则表达式大师可以提供帮助?
【问题讨论】:
-
你在使用PHP's
XMLReaderhere吗?我发现使用基于 expat 的解析器重写 XML 通常更容易,这里有一个示例,其中有一个示例(基本)在其末尾是如何工作的:PHP change xmlns in XML file
标签: php xml regex xml-parsing xml-namespaces