1

リモートサーバーからXMLファイルをプルし、simplexml_load_stringとjson_encodeを使用してJSONに変換するPHPスクリプトがあります。ただし、simplexml_load_stringは、次のようにインライン属性を無視しているようです。

<AxisFeedrate dataItemId="iid7" timestamp="2012-03-21T15:15:41-04:00" sequence="7" name="Yfrt" subType="ACTUAL" units="MILLIMETER/SECOND">UNAVAILABLE</AxisFeedrate>

この場合、JSON表現は{AxisFeedrate:'UNAVAILABLE'}になります。

ただし、これらの属性を使用できるようにする必要があります。私が取り組んできたアイデアの1つは、文字列を置き換えて、属性を次のようにテキストノードに変換することです。

<AxisFeedrate>
  <dataItemId>iid7</dataItemId>
  <timestamp>2012-03-21T15:15:41-04:00</timestamp>
  <sequence>7</sequence>
  <name>Yfrt</name>
  <subType>ACTUAL</subType>
  <units>MILLIMETER/SECOND"</units>
  <value>UNAVAILABLE</value>
</AxisFeedrate>

通常の検索/置換で属性を独自のタグ要素に変換できますが、少なくとも検索/置換では、元のテキスト値を値タグでラップするのに問題があります。

これを行うためのいくつかの良いアプローチは何ですか?上記のXMLのチャンクは、さまざまなデータ項目の多くの同様のチャンクの真ん中にあるため、最初の終了>を>...に置き換えることから始めることはできませんでした。

4

3 に答える 3

1

SimpleXML自体を使用して属性を読み取ることができます。

例:

<?php
$xml=simplexml_load_string('<AxisFeedrate dataItemId="iid7" timestamp="2012-03-21T15:15:41-04:00" sequence="7" name="Yfrt" subType="ACTUAL" units="MILLIMETER/SECOND">UNAVAILABLE</AxisFeedrate>');

foreach($xml->attributes() as $k=>$v) {
    echo $k." -> ".(string)$v."\n";

}
?>


出力:

dataItemId -> iid7
timestamp -> 2012-03-21T15:15:41-04:00
sequence -> 7
name -> Yfrt
subType -> ACTUAL
units -> MILLIMETER/SECOND
于 2012-04-20T02:31:45.807 に答える
0

この正規表現を試してください:([\w]*?)="(.*?)"この置換で<$1>$2</$1>\n

于 2012-04-20T02:17:47.910 に答える
0

SimpleXMLを使用する必要があります。ただし、値を文字列型に明示的にキャストする必要があることに注意してください。そうしないと、オブジェクトが取得されます。

$xml_string = <<<XML
<AxisFeedrate 
dataItemId="iid7" 
timestamp="2012-03-21T15:15:41-04:00" 
sequence="7" 
name="Yfrt" 
subType="ACTUAL" 
units="MILLIMETER/SECOND"
>UNAVAILABLE</AxisFeedrate>
XML;

$xml = simplexml_load_string($xml_string);

$axis_info = array('value' => (string)$xml);

foreach($xml -> attributes() as $attr => $val) {
    $axis_info[$attr] = (string) $val;
}

echo json_encode(array("AxisFeedrate" => $axis_info));

アップデート:

これにより、より一般的なバージョンが提供されますが、属性は配列としてキャストされ、これは単一の要素でのみ機能することに注意してください。

$xml_string = <<<XML
<AxisFeedrate dataItemId="iid7" timestamp="2012-03-21T15:15:41-04:00" sequence="7" name="Yfrt" subType="ACTUAL" units="MILLIMETER/SECOND">UNAVAILABLE</AxisFeedrate>
XML;

$xml = simplexml_load_string($xml_string);

$obj_name = $xml -> getName();

$attributes = (array) $xml->attributes();

$axis_info[$obj_name] = $attributes["@attributes"];
$axis_info[$obj_name]['value'] = (string) $xml;

echo json_encode($axis_info);
于 2012-04-20T02:59:23.027 に答える