0

PHP でネストされた配列を XML ドキュメントに変換しようとしています。子のない配列が XML 出力から完全に隠されている理由をトラブルシューティングできませんでした。XMLにも子がないと表示されるようにします。

関連するコード スニペットは次のとおりです。

private function response_xml_encode($node, $data)
{
  if ($node == null) return false;
  if (!is_array($data)) return false;
  foreach ($data as $key => $value)
  {
    if (is_array($value) && !$this->response_xml_encode_assocarray($value))
    {
      foreach ($value as $val)
        $node->addChild($key, htmlentities($val));
    }
    else if (is_array($value))
    {
      $this->response_xml_encode($node->addChild($key), $value);
    }
    else if (!$this->response_xml_encode_validkey($key))
    {
      $subnode = $node->addChild($node->getName(), htmlentities($value));
      $subnode->addAttribute('keyinvalid', 'true');
      $subnode->addAttribute('key', htmlentities($key));
    }
    else
    {
      $node->addChild($key, htmlentities($value));
    }
  }
}

private function response_xml_encode_assocarray($arr)
{
  // Let's us know if this array has associative key value pairs, or if it has numeric key value pairs
  // Returns TRUE if this array has any non-numeric key in it
  foreach ($arr as $key => $value)
  {
    if (!is_numeric($key)) return true;
  }
  return false;
}

private function response_xml_encode_validkey($key)
{
  if (strpos('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_', substr($key, 0, 1)) === false) return false;
  return (preg_match('/[^A-Za-z_-]/s', $key) === 0);
}

次に、次を使用して呼び出します。

$response = array(
  'result' => 0,
  'message' => 'Success.',
  'function' => 'test',
  'data' => array(
    'GET'  => $_GET,
    'POST' => $_POST,
    'foo'  => array(
      'bar' => array(
        'bad' => array(
          'wolf' => array(
            'some_value' => 'testtesttest'
          )
        )
      )
    )
  )
);
$root = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><response/>');
$this->response_xml_encode($root, $response);
return $root->asXML();

$_GET$_POSTは空の配列であることに注意してください。

返されるものは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<response>
  <result>0</result>
  <message>Success.</message>
  <function>test</function>
  <data>
    <foo>
      <bar>
        <bad>
          <wolf>
            <some_value>testtesttest</some_value>
          </wolf>
        </bad>
      </bar>
    </foo>
  </data>
</response>

しかし、期待されるのは、それが表示されることと、表示さ<GET/>れる<POST/><foo>です:

<?xml version="1.0" encoding="UTF-8"?>
<response>
  <result>0</result>
  <message>Success.</message>
  <function>test</function>
  <data>
    <GET/>
    <POST/>
    <foo>
      <bar>
        <bad>
          <wolf>
            <some_value>testtesttest</some_value>
          </wolf>
        </bad>
      </bar>
    </foo>
  </data>
</response>
4

1 に答える 1

1

foreachループの開始時に以下のコード スニペットを配置する必要があります

foreach ($data as $key => $value)
{    
   if(array_key_exists($key, $data) && empty($value))
   {
       $node->addChild($key, "");
   }
   //your other code goes here
}

上記のコードは、以下のような目的の出力を出力します。

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <result>
    </result>
    <message>Success.</message>
    <function>test</function>
    <data>
        <GET>
        </GET>
        <POST>
        </POST>
        <foo>
            <bar>
                <bad>
                    <wolf>
                        <some_value>test test test</some_value>
                    </wolf>
                </bad>
            </bar>
        </foo>
    </data>
</response>

サンプル用のコードを取得し、クラスを作成して実行しました。したがって、これはあなたにとってもうまくいくはずです。

于 2013-05-10T11:53:36.547 に答える