在标记内删除XML中的减号

时间:2012-11-22 16:19:55

标签: php

我正在尝试使用preg_replace替换 - 仅用于标签之间的_

在POST请求的标头响应中正常接收测试字符串

  $response['body'] = <<<STR
    <?xml version="1.0"?>
        <tracking-events>
        <tracking-event>
        <type>DELIVERED</type>
        <time>2012-12-04T11:45:08.554+0200</time>
        <tracking-id>AB10000</tracking-id>
        </tracking-event>
        </tracking-events>
    STR;

你可以帮我改变吗 - 来_并保持日期格式

$response['body'] = <<<STR
<?xml version="1.0"?>
    <tracking_events>
    <tracking_event>
    <type>DELIVERED</type>
    <time>2012-12-04T11:45:08.554+0200</time>
    <tracking_id>AB10000</tracking_id>
    </tracking_event>
    </tracking_events>
STR;

4 个答案:

答案 0 :(得分:1)

我建议使用XSL样式表来转换Document:

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

<xsl:template match="*"> 
  <xsl:choose>
    <xsl:when test="contains(name(), '-')">
      <xsl:element name="{translate(name(),'-','_')}">
      <xsl:copy-of select="@*"/>
          <xsl:apply-templates/>
      </xsl:element>
    </xsl:when>
    <xsl:otherwise>
      <xsl:copy>
          <xsl:copy-of select="@*"/>
          <xsl:apply-templates/>
      </xsl:copy>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

</xsl:stylesheet>

样式表将使用固定的nodeName创建一个新元素,并将属性和childNodes复制到该节点上,这就是全部。

演示:http://www.xsltcake.com/slices/5Wuq6P

答案 1 :(得分:0)

您是否尝试使用正则表达式?像

这样的东西
$response['body'] = preg_replace('(<[^>]*)[a-zA-Z]\-[a-zA-Z]([^>]*)', '$1_$2', $response['body']);

未经过上述测试,但我认为它应该可行。

答案 2 :(得分:0)

经过测试,确实有效! :D

 $xml=preg_replace('/<([^>]*?)-([^>]*?)>/', '<$1_$2>',$xml);

答案 3 :(得分:0)

这循环遍历XML表示。我担心任何属性都会丢失(如果需要,应该很容易调整函数以保留它们)。这是一个通用功能,不会被文本内容绊倒。

<?php

header('Content-Type: text/plain');


$response['body'] = <<<STR
<?xml version="1.0"?>
    <tracking-events>
    <tracking-event>
    <type>DELIVERED</type>
    <time>2012-12-04T11:45:08.554+0200</time>
    <tracking-id>AB10000</tracking-id>
    </tracking-event>
    </tracking-events>
STR;

$existing = new SimpleXMLElement($response['body']);
$name = $existing->getName();
$name = str_replace('-', '_', $name);
$new = new SimpleXMLElement('<' . $name . '/>');

add_corrected_nodes($existing, $new);

function add_corrected_nodes(&$from, &$to) {
    foreach ($from as $k => $v) {
        $new = str_replace('-', '_', $k);
        $child = $to->addChild($new);
        if ($from->$k->children()) {
            add_corrected_nodes($from->$k->children(), $child);
        } else {
            $to->$new = $v;
        }
    }
}

print_r($new->asXML());