使用PHP将JSON数据转换为HTML下拉列表

时间:2016-02-24 12:49:28

标签: php html json xml

如何使用PHP将此XML / JSON数据转换为HTML select下拉列表?

JSON / XML数据:

{"CountryList":"<Countries><Country><Code>AF<\/Code><Name>Afghanistan<\/Name><\/Country><Country><Code>AL<\/Code><Name>Albania<\/Name><\/Country><Country><Code>DZ<\/Code><Name>Algeria<\/Name><\/Country><Country><Code>AS<\/Code><Name>American Samoa<\/Name><\/Country><Country><Code>AD<\/Code><Name>Andorra<\/Name><\/Country><Country><Code>AO<\/Code><Name>Angola<\/Name><\/Country><Country><Code>AI<\/Code><Name>Anguilla<\/Name><\/Country><Country><Code>AQ<\/Code><Name>Antarctica<\/Name><\/Country><Country><Code>AG<\/Code><Name>Antigua &amp; Barbuda<\/Name><\/Country><Country><Code>AR<\/Code><Name>Argentina<\/Name><\/Country><Country><Code>AM<\/Code><Name>Armenia<\/Name><\/Country><Country><Code>AW<\/Code><Name>Aruba<\/Name><\/Country><Country><Code>AU<\/Code><Name>Australia<\/Name><\/Country><Country><Code>AT<\/Code><Name>Austria<\/Name><\/Country><Country><Code>AZ<\/Code><Name>Azerbaijan<\/Name><\/Country><Country><Code>BS<\/Code><Name>Bahamas<\/Name><\/Country><Country><Code>BH<\/Code><Name>Bahrain<\/Name><\/Country><Country><Code>BD<\/Code><Name>Bangladesh<\/Name><\/Country><Country><Code>BB<\/Code><Name>Barbados<\/Name><\/Country><Country><Code>BY<\/Code><Name>Belarus (Belorussia)<\/Name><\/Country><\/Countries>","Error":{"ErrorCode":0,"ErrorMessage":""},"Status":1,"TokenId":"bdf0738c-7a47-410e-961a-52da9b5df935"}

所需的HTML输出:

<select>
    <option value="AF|Afghanistan">Afghanistan</option>
    <option value="AL|Albania">Albania</option>
    <option value="DZ|Algeria">Algeria</option>
    <option value="AS|American Samoa">American Samoa</option>
    <option value="AD|Andorra">Andorra</option>
    <option value="AO|Angola">Angola</option>
    <option value="AI|Anguilla">Anguilla</option>
    <option value="AQ|Antarctica">Antarctica</option>
    <option value="AG|Antigua & Barbuda">Antigua & Barbuda</option>
    <option value="AR|Argentina">Argentina</option>
    <option value="AM|Armenia">Armenia</option>
    <option value="AW|Aruba">Aruba</option>
    <option value="AU|Australia">Australia</option>
    <option value="AT|Austria">Austria</option>
    <option value="AZ|Azerbaijan">Azerbaijan</option>
    <option value="BS|Bahamas">Bahamas</option>
    <option value="BH|Bahrain">Bahrain</option>
    <option value="BD|Bangladesh">Bangladesh</option>
    <option value="BB|Barbados">Barbados</option>
    <option value="BY|Belarus (Belorussia)">Belarus (Belorussia)</option
</select>

<小时/> 解析后,我得到这样的数组

阵列

    [CountryList] =&gt; AFAfghanistanALAlbaniaDZAlgeriaASAmerican SamoaADAndorraAOAngolaAIAnguillaAQAntarcticaAGAntigua&amp; BarbudaARArgentinaAMArmeniaAWArubaAUAustraliaATAustriaAZAzerbaijanBSBahamasBHBahrainBDBangladeshBBBarbadosBYBelarus(Belorussia)

   [错误] =&gt;阵列
       (
         [ErrorCode] =&gt; 0
           [ErrorMessage] =&gt;
       )

   [状态] =&gt; 1

   [TokenId] =&gt; 5a5e32c4-77ee-4703-b0b1-4ff275ac61asw0 )

我将在以下链接中看到的数据 https://drive.google.com/file/d/0B9VV_J4sKTatdWJGeHJkOVZzZ00/view?usp=sharing

3 个答案:

答案 0 :(得分:2)

您的数据不是XML,而是JSON字符串。

如果您可以访问原始XML数据,则可以获得更好的结果。

顺便说一句,要解码您当前的数据,请使用json_decode

$data = json_decode($data);

然后,创建一个与国家/地区架构匹配的模式,并匹配$data->CountryList

中的所有匹配项
$pattern = '{([^<]+)</Code>([^<]+)</Name></Country>}';
preg_match_all( $pattern, $data->CountryList, $matches );

此时,您可以通过<option>循环输出foreach列表:

foreach( $matches[0] as $key => $val )
{
    echo sprintf( '<option value="%s">%s</option>', $matches[1][$key], $matches[2][$key] );
}

eval.in demo

编辑:模式语法

{([^<]+)</Code>([^<]+)</Name></Country>}
 └──┬──┘└──┬──┘└──┬──┘└─┬─────────────┘
    │      │      │     └ 2nd and 3rd tags (not captured)
    │      │      └ One or more chars except ‘<’ (2nd captured group)
    │      └ 1st tag (not captured)
    └ One or more chars except ‘<’ (1st captured group)

答案 1 :(得分:0)

您JSON将国家/地区包含为XML。所以你必须首先解码JSON:

$json = json_decode($data);

之后解析XML:

$source = new DOMDocument();
$source->loadXml($json->CountryList);
$xpath = new DOMXpath($source);

您可以使用DOM生成目标XML。创建目标文档并附加根节点。使用Xpath迭代这些国家/地区并创建/附加选项元素。

$target = new DOMDocument();
$options = $target->appendChild($target->createElement('select'));

foreach ($xpath->evaluate('/Countries/Country') as $country) {
  $option = $options->appendChild(
    $target->createElement('option')
  );
  $option->setAttribute(
    'value', 
    $xpath->evaluate('string(Code)', $country)
  );
  $option->appendChild(
    $target->createTextNode(
      $xpath->evaluate('string(Name)', $country)
    )
  );
}

$target->formatOutput = TRUE;
echo $target->saveXml($options);

输出:

<select>
  <option value="AF">Afghanistan</option>
  <option value="AL">Albania</option>
  <option value="DZ">Algeria</option>
  <option value="AS">American Samoa</option>
  <option value="AD">Andorra</option>
  <option value="AO">Angola</option>
  <option value="AI">Anguilla</option>
  ...

答案 2 :(得分:0)

试试这个可能会对你有所帮助。

<强>解决方案

$json = json_decode($data);$source = new DOMDocument();
$source->loadXml($json->CountryList);
$xpath = new DOMXpath($source);
$target = new DOMDocument();
$options = $target->appendChild($target->createElement('select'));

foreach ($xpath->evaluate('/Countries/Country') as $country) {
    $countryCode = $xpath->evaluate('string(Code)', $country);
    $countryName = $xpath->evaluate('string(Name)', $country);
    $option = $options->appendChild(
        $target->createElement('option')
    );
    $option->setAttribute('value', $countryCode . "|" . $countryName);
    $option->appendChild($target->createTextNode($countryName));
}

$target->formatOutput = TRUE;
echo $target->saveXml($options);

<强>输出:

    <select>
        <option value="AF|Afghanistan">Afghanistan</option>
        <option value="AL|Albania">Albania</option>
        <option value="DZ|Algeria">Algeria</option>
        <option value="AS|American Samoa">American Samoa</option>
        <option value="AD|Andorra">Andorra</option>
        <option value="AO|Angola">Angola</option>
        <option value="AI|Anguilla">Anguilla</option>
        <option value="AQ|Antarctica">Antarctica</option>
        <option value="AG|Antigua & Barbuda">Antigua & Barbuda</option>
        <option value="AR|Argentina">Argentina</option>
        <option value="AM|Armenia">Armenia</option>
        <option value="AW|Aruba">Aruba</option>
        <option value="AU|Australia">Australia</option>
        <option value="AT|Austria">Austria</option>
        <option value="AZ|Azerbaijan">Azerbaijan</option>
        <option value="BS|Bahamas">Bahamas</option>
        <option value="BH|Bahrain">Bahrain</option>
        <option value="BD|Bangladesh">Bangladesh</option>
        <option value="BB|Barbados">Barbados</option>
        <option value="BY|Belarus (Belorussia)">Belarus (Belorussia)</option
     </select>