【问题标题】:How to convert XML attributes to text nodes如何将 XML 属性转换为文本节点
【发布时间】: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 块位于不同数据项的许多相似块的中间,所以我不能只是从将第一个结束 > 替换为 >...

【问题讨论】:

    标签: php xml json


    【解决方案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]*?)="(.*?)" 用这个替换 &lt;$1&gt;$2&lt;/$1&gt;\n

      【讨论】:

      • 这不会导致 XML 格式不正确吗?喜欢&lt;AxisFeedrate &lt;dataItemId&gt;iid7&lt;/dataItemId&gt;&gt;??
      【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-05
        • 1970-01-01
        • 1970-01-01
        • 2017-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-07
        相关资源
        最近更新 更多