1

preg_replaceを使用して、タグ間でのみ-to_を置き換えようとしています

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

4 に答える 4

1

XSLスタイルシートを使用してドキュメントを変換することをお勧めします。

<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

于 2012-11-22T17:05:46.553 に答える
0

テストして動作しました!:D

 $xml=preg_replace('/<([^>]*?)-([^>]*?)>/', '<$1_$2>',$xml);
于 2012-11-22T16:41:29.860 に答える
0

正規表現を使ってみましたか?何かのようなもの

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

上記のテストは行っていませんが、動作するはずです。

于 2012-11-22T16:34:32.440 に答える
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());
于 2012-11-22T20:16:44.410 に答える