如何将XML属性转换为文本节点

时间:2012-04-20 02:06:09

标签: php xml json

我有一个PHP脚本,它从远程服务器提取XML文件,并使用simplexml_load_string和json_encode将其转换为JSON。但是,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>

我可以使用常规的查找/替换将属性转换为自己的标记元素,但是我在将原始文本值包装在Value标记中时遇到了问题,至少在查找/替换时是这样。

这样做的好方法是什么?上面的XML块在不同数据项的许多类似块的中间,所以我不能只是从替换第一个关闭&gt;开始。与&gt; ...

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

尝试此正则表达式:([\w]*?)="(.*?)"并使用此替换<$1>$2</$1>\n

答案 2 :(得分: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);