如何使用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 & 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
答案 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>