Как преобразовать XML-атрибуты в текстовые узлы

У меня есть PHP-скрипт, который извлекает XML-файл с удаленного сервера и преобразует его в JSON с помощью simplexml_load_string и json_encode. Тем не менее, 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"}

Однако мне нужно иметь эти атрибуты. Одна из идей, к которой я подходила, заключается в замене строк, чтобы превратить атрибуты в текстовые узлы следующим образом:

 <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> 

Я могу превратить атрибуты в свои собственные элементы тега с помощью регулярных find / replace, но мне не удается обернуть исходное текстовое значение в теге Value, по крайней мере, с помощью find / replace.

Каковы некоторые хорошие подходы для этого? Вышеупомянутый фрагмент XML находится в середине многих похожих кусков на разных элементах данных, поэтому я не мог просто начать с замены первого закрытия> на> …

Вы можете использовать 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 

Попробуйте это регулярное выражение: ([\w]*?)="(.*?)" С заменой <$1>$2</$1>\n

Вы должны использовать 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);