2011-01-12 41 views
0

我在字符串中有以下xml。使正则表达式更改为保存xml格式的字符串

<field1 param1="value" hun="true"> 
<field2 hun="true"> 
<field3 param2="value" hun="true"> 

我想找到的hun="true">每个实例,并添加另一个XML领域<newxml value="number">所以我的XML看起来像这样

<field1 param1="value" hun="true"> 
<newxml value="number"> 
<field2 hun="true"> 
<newxml value="number"> 
<field3 param2="value" hun="true"> 
<newxml value="number"> 
+0

BTW,不能很好地形成的样品XML(所有标签都是不封闭) – Tomalak 2011-01-12 03:47:26

+0

'的preg_replace('/勋=“true”> /','hun =“true”>'。“\ n”。''。“\ n”,$ xmlData);` – Orbling 2011-01-12 04:00:04

回答

0

,也许你可以做一个简单的字符串的字符串替换,替换每个实例“匈奴=‘真’”与'hun="true"><newxml value="number">'

+0

这会至少扭曲评论或CDATA部分,并且如果由于某种原因包含`hun =“true”``,则会明确地销毁属性。 – Tomalak 2011-01-12 03:33:21

1

的我发现一建议修改XML正则表达式(或实际上任何字符串操作工具)。通过这个小小的XSLT样式表,而不是运行您的XML:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <!-- this template copies your input XML unchanged... --> 
    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*" /> 
    </xsl:copy> 
    </xsl:template> 

    <!-- ...except for anything with hun="true", where it adds a new element --> 
    <xsl:template match="*[@hun = 'true']"> 
    <xsl:copy-of select="." /> 
    <newxml value="number" /> 
    </xsl:template> 
</xsl:stylesheet> 

PHP函数用于此任务是xslt_process()see the docs)。

如果只添加它缺少<newxml value="number" />,第二个模板将变为:

<xsl:template match="*[@hun = 'true' 
         and not(following-sibling::*[1][self::newxml])] 
    "> 
    <xsl:copy-of select="." /> 
    <newxml value="number" /> 
    </xsl:template>