我正在尝试使用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;
答案 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复制到该节点上,这就是全部。
答案 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());