在PHP中,通過使用json_encode()
很容易傳回json對象。
但是,是否存在與此相當的XML?在PHP中是否有像xml_encode()一樣的json_encode()?
回答
JSON可以本地表示php數組,整數,字符串等。 XML沒有這樣的概念 - 只有元素,屬性和文本。如果您想逐字傳輸對象,請使用JSON。如果您想實現複雜的API,請使用XML,例如php DOM interface。
您可以定義自己的xml_encode()
功能,如該從http://darklaunch.com/2009/05/23/php-xml-encode-using-domdocument-convert-array-to-xml-json-encode
function xml_encode($mixed, $domElement=null, $DOMDocument=null) {
if (is_null($DOMDocument)) {
$DOMDocument =new DOMDocument;
$DOMDocument->formatOutput = true;
xml_encode($mixed, $DOMDocument, $DOMDocument);
echo $DOMDocument->saveXML();
}
else {
// To cope with embedded objects
if (is_object($mixed)) {
$mixed = get_object_vars($mixed);
}
if (is_array($mixed)) {
foreach ($mixed as $index => $mixedElement) {
if (is_int($index)) {
if ($index === 0) {
$node = $domElement;
}
else {
$node = $DOMDocument->createElement($domElement->tagName);
$domElement->parentNode->appendChild($node);
}
}
else {
$plural = $DOMDocument->createElement($index);
$domElement->appendChild($plural);
$node = $plural;
if (!(rtrim($index, 's') === $index)) {
$singular = $DOMDocument->createElement(rtrim($index, 's'));
$plural->appendChild($singular);
$node = $singular;
}
}
xml_encode($mixedElement, $node, $DOMDocument);
}
}
else {
$mixed = is_bool($mixed) ? ($mixed ? 'true' : 'false') : $mixed;
$domElement->appendChild($DOMDocument->createTextNode($mixed));
}
}
}
的一個你可以使用xmlrpc_encode
。
xmlrpc_encode ($your_array);
請小心,因爲此功能是實驗性的。
參考:
$str = htmlentities($str , ENT_XML1);
這是一個noce函數,但有時可能會動搖。 – iJamesPHP
這在大多數情況下對我的作品 http://php.net/manual/en/function.htmlentities.php
不支持數組,並且不會創建xml文件,它只需xml編碼單個字符串(將<>轉換爲> <等) – hanshenrik
這裏是一個php7.0 +,我敢打賭,這是遠遠沒有達到最佳,代碼是非平凡的,它有不被測試了很多,但至少它適用於我的數據(不像塞弗的代碼)...
例如:
$test = array (
'normal1' => 'foo',
'normal2' => 'bar',
'foo_assoc' => [
'foo',
'bar',
'baz',
[
'derp',
'derpmore'
]
],
'foo_nonassoc' => [
'derppp' => 'yes',
'daarpp' => 'no',
'lel',
'far' => 'away'
],
'normal3' => 'lala',
'deep' => [
'deeper' => [
'deeper2' => [
'deepest' => [
'quite',
'deep',
'indeed'
],
'checkmate'
]
]
],
'special' => 'encoding<special>characters&test',
'me_n_you' => 'true'
);
echo (hhb_xml_encode ($test));
輸出:
<normal1>foo</normal1>
<normal2>bar</normal2>
<foo_assoc>foo</foo_assoc>
<foo_assoc>bar</foo_assoc>
<foo_assoc>baz</foo_assoc>
<foo_assoc>derp</foo_assoc>
<foo_assoc>derpmore</foo_assoc>
<foo_nonassoc>
<derppp>yes</derppp>
<daarpp>no</daarpp>
<foo_nonassoc>lel</foo_nonassoc>
<far>away</far>
</foo_nonassoc>
<normal3>lala</normal3>
<deep>
<deeper>
<deeper2>
<deepest>quite</deepest>
<deepest>deep</deepest>
<deepest>indeed</deepest>
<deeper2>checkmate</deeper2>
</deeper2>
</deeper>
</deep>
<special>encoding<special>characters&test</special>
<me_n_you>true</me_n_you>
功能: - 編輯:修正了用編碼空陣列。
function hhb_xml_encode(array $arr, string $name_for_numeric_keys = 'val'): string {
if (empty ($arr)) {
// avoid having a special case for <root/> and <root></root> i guess
return '';
}
$is_iterable_compat = function ($v): bool {
// php 7.0 compat for php7.1+'s is_itrable
return is_array ($v) || ($v instanceof \Traversable);
};
$isAssoc = function (array $arr): bool {
// thanks to Mark Amery for this
if (array() === $arr)
return false;
return array_keys ($arr) !== range (0, count ($arr) - 1);
};
$endsWith = function (string $haystack, string $needle): bool {
// thanks to MrHus
$length = strlen ($needle);
if ($length == 0) {
return true;
}
return (substr ($haystack, - $length) === $needle);
};
$formatXML = function (string $xml) use ($endsWith): string {
// there seems to be a bug with formatOutput on DOMDocuments that have used importNode with $deep=true
// on PHP 7.0.15...
$domd = new DOMDocument ('1.0', 'UTF-8');
$domd->preserveWhiteSpace = false;
$domd->formatOutput = true;
$domd->loadXML ('<root>' . $xml . '</root>');
$ret = trim ($domd->saveXML ($domd->getElementsByTagName ("root")->item (0)));
assert (0 === strpos ($ret, '<root>'));
assert ($endsWith ($ret, '</root>'));
$full = trim (substr ($ret, strlen ('<root>'), - strlen ('</root>')));
$ret = '';
// ... seems each line except the first line starts with 2 ugly spaces,
// presumably its the <root> element that starts with no spaces at all.
foreach (explode ("\n", $full) as $line) {
if (substr ($line, 0, 2) === ' ') {
$ret .= substr ($line, 2) . "\n";
} else {
$ret .= $line . "\n";
}
}
$ret = trim ($ret);
return $ret;
};
// $arr = new RecursiveArrayIterator ($arr);
// $iterator = new RecursiveIteratorIterator ($arr, RecursiveIteratorIterator::SELF_FIRST);
$iterator = $arr;
$domd = new DOMDocument();
$root = $domd->createElement ('root');
foreach ($iterator as $key => $val) {
// var_dump ($key, $val);
$ele = $domd->createElement (is_int ($key) ? $name_for_numeric_keys : $key);
if (! empty ($val) || $val === '0') {
if ($is_iterable_compat ($val)) {
$asoc = $isAssoc ($val);
$tmp = hhb_xml_encode ($val, is_int ($key) ? $name_for_numeric_keys : $key);
// var_dump ($tmp);
// die();
$tmp = @DOMDocument::loadXML ('<root>' . $tmp . '</root>');
foreach ($tmp->getElementsByTagName ("root")->item (0)->childNodes ?? [ ] as $tmp2) {
$tmp3 = $domd->importNode ($tmp2, true);
if ($asoc) {
$ele->appendChild ($tmp3);
} else {
$root->appendChild ($tmp3);
}
}
unset ($tmp, $tmp2, $tmp3);
if (! $asoc) {
// echo 'REMOVING';die();
// $ele->parentNode->removeChild($ele);
continue;
}
} else {
$ele->textContent = $val;
}
}
$root->appendChild ($ele);
}
$domd->preserveWhiteSpace = false;
$domd->formatOutput = true;
$ret = trim ($domd->saveXML ($root));
assert (0 === strpos ($ret, '<root>'));
assert ($endsWith ($ret, '</root>'));
$ret = trim (substr ($ret, strlen ('<root>'), - strlen ('</root>')));
// seems to be a bug with formatOutput on DOMDocuments that have used importNode with $deep=true..
$ret = $formatXML ($ret);
return $ret;
}
有點晚,但值得注意的是,這不包括doctype或根元素,從而變得格式不良的XML,您可以用'return'<?xml version =「1.0」encoding =「UTF-8」?>
- 1. 是否有可能在PHP中像Java的socksProxyHost一樣?
- 2. 是否有一個像PHP中的getimagesize一樣的Python函數?
- 3. 是否有可能json_encode在PHP中未定義的值?
- 4. 在Delphi中是否有像PHP的vardump這樣的函數?
- 5. 是否有像JavaScript一樣的API?
- 6. 是否可以在一個php文件中使用兩個json_encode()?
- 7. 是否像在swift中轉換一樣?
- 8. PHP是否有像Jquery一樣的可視化文檔?
- 9. PHP是否有像jsoup一樣的HTML解析器?
- 10. 我們是否也有像PHP函數庫一樣的Perl-CPAN?
- 11. PHP是否有像Rails一樣的真實性標記?
- 12. 是否有另一個PHP foreach樣本?
- 13. 在mysql 5.6.21中是否有像max_statement_time一樣的可用變量?
- 14. 在Eclipse中是否有像命令行一樣的工具?
- 15. 在java中是否有像malloc/free一樣的東西?
- 16. 在WinRT中是否有像樹一樣的控制樹?
- 17. 是否包含像php中的函數一樣的工作?
- 18. 像在SQL Server中一樣,Rails中是否有DELETED表?
- 19. Android中是否有像Asp.net中的appSettings一樣的東西?
- 20. 是否有可能像使用tcpdump一樣在php中捕獲flv鏈接?
- 21. 是否有可能在php中使用echo會像var_dump一樣工作?
- 22. 在PHP中,是否有像stristr這樣的函數,但是對於數組?
- 23. 是否有可能在Java中像c#一樣形成設計?
- 24. 像Bootstrap一樣,在magento 1.9 RWD中是否有網格系統?
- 25. 在php> = 5.3.10中是否有一個ini設置,允許路徑的行爲像php 5.2一樣?
- 26. 是否有像PHP的exit()這樣的JavaScript函數?
- 27. Django中是否有像WordPress一樣的admin ajax url?
- 28. 機器人中是否有像pagefactory一樣的模式?
- 29. ImageResizer中是否有像PNY壓縮一樣的PNG壓縮?
- 30. iOS中是否有像清除一樣的命令?
工作正常,只是要注意,這是爲自己好太聰明瞭 - 如果你有與「S」結尾的標籤名稱 - 它會自動進行標籤的單數形式,添加內.. 。(嘗試,例如,當製作具有不應具有任何'座標'子標籤的'座標'標籤的kml時:-P – MortenSickel