如何将 XML 属性转换为文本节点
Posted
技术标签:
【中文标题】如何将 XML 属性转换为文本节点【英文标题】:How to convert XML attributes to text nodes 【发布时间】:2012-05-01 15:07:08 【问题描述】:我有一个 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>
我可以通过常规查找/替换将属性转换为它们自己的标记元素,但我无法将原始文本值包装在值标记中,至少使用查找/替换时是这样。
有什么好的方法可以做到这一点?上面的 XML 块位于不同数据项的许多相似块的中间,所以我不能只是从将第一个结束 > 替换为 >...
【问题讨论】:
【参考方案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
【讨论】:
【参考方案2】:试试这个正则表达式:([\w]*?)="(.*?)"
用这个替换 <$1>$2</$1>\n
【讨论】:
这不会导致 XML 格式不正确吗?喜欢<AxisFeedrate <dataItemId>iid7</dataItemId>>
??【参考方案3】:
您应该使用 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);
【讨论】:
以上是关于如何将 XML 属性转换为文本节点的主要内容,如果未能解决你的问题,请参考以下文章
java解析xml文件,会把节点属性中的换行转换成空格,怎样才能避免此类转换,即保留换行