使用 json_decode 从文本文件生成 XML
Generate XML out of Textfile using json_decode
我有这个文本文件 (namelist.txt):
{"0":"Mr Tony Test","1":"Ms Tina Testy"}
我试着把它转换成XML:
<?php
$xml = new DOMDocument();
$names = json_decode(file_get_contents('namelist.txt'));
foreach ($names as $name)
{
$xml_name = $xml->createElement($name);
}
$xml->save("rss.xml");
?>
我收到以下错误:
Fatal error: Uncaught exception 'DOMException' with message 'Invalid
Character Error' in C:\xampp\htdocs\xibo\rss.php:6 Stack trace: #0
C:\xampp\htdocs\xibo\rss.php(6): DOMDocument->createElement('Mr Tony
Te...') #1 {main} thrown in C:\xampp\htdocs\xibo\rss.php on line 6
甚至可以这样吗?
编辑 1:
尝试了@spiky 的解决方案,但结果是空白页:
<?php
$obj=('namelist.txt');
function json_to_xml($obj){
$str = "";
if(is_null($obj))
return "<null/>";
elseif(is_array($obj)) {
//a list is a hash with 'simple' incremental keys
$is_list = array_keys($obj) == array_keys(array_values($obj));
if(!$is_list) {
$str.= "<hash>";
foreach($obj as $k=>$v)
$str.="<item key=\"$k\">".json_to_xml($v)."</item>".CRLF;
$str .= "</hash>";
} else {
$str.= "<list>";
foreach($obj as $v)
$str.="<item>".json_to_xml($v)."</item>".CRLF;
$str .= "</list>";
}
return $str;
} elseif(is_string($obj)) {
return htmlspecialchars($obj) != $obj ? "<![CDATA[$obj]]>" : $obj;
} elseif(is_scalar($obj))
return $obj;
else
throw new Exception("Unsupported type $obj");
}
?>
如果解码 JSON 是一个具有两个属性(0
和 1
)的对象。
var_dump(json_decode('{"0":"Mr Tony Test","1":"Ms Tina Testy"}'));
输出:
object(stdClass)#1 (2) {
["0"]=>
string(12) "Mr Tony Test"
["1"]=>
string(13) "Ms Tina Testy"
}
您迭代属性并将值用作元素名称。但它们不是有效名称。这是一个产生错误的静态示例:
$document = new DOMDocument();
$document->createElement('name with spaces');
输出:
Fatal error: Uncaught exception 'DOMException' with message
'Invalid Character Error' in /tmp/...
所以你要确保你生成了一个有效的XML。喜欢这个:
$json = json_decode('{"0":"Mr Tony Test","1":"Ms Tina Testy"}');
$document = new DOMDocument();
$names = $document->appendChild(
$document->createElement('names')
);
foreach ($json as $value) {
$names
->appendChild($document->createElement('name'))
->appendChild($document->createTextNode($value));
}
$document->formatOutput = TRUE;
echo $document->saveXml();
输出:
<?xml version="1.0"?>
<names>
<name>Mr Tony Test</name>
<name>Ms Tina Testy</name>
</names>
最好为 XML 使用可定义的节点结构,而不是数据定义的节点结构。
您将结果 xml 文件命名为 'rss.xml'。 RSS 是一种定义的格式。所以如果你想生成RSS你必须生成特定的节点。
$json = json_decode('{"0":"Mr Tony Test","1":"Ms Tina Testy"}');
$document = new DOMDocument();
$rss = $document->appendChild($document->createElement('rss'));
$rss->setAttribute('version', '2.0');
$channel = $rss->appendChild($document->createElement('channel'));
foreach ($json as $value) {
$item = $channel->appendChild($document->createElement('item'));
$item
->appendChild($document->createElement('title'))
->appendChild($document->createTextNode($value));
}
$document->formatOutput = TRUE;
echo $document->saveXml();
输出:
<?xml version="1.0"?>
<rss version="2.0">
<channel>
<item>
<title>Mr Tony Test</title>
</item>
<item>
<title>Ms Tina Testy</title>
</item>
</channel>
</rss>
我有这个文本文件 (namelist.txt):
{"0":"Mr Tony Test","1":"Ms Tina Testy"}
我试着把它转换成XML:
<?php
$xml = new DOMDocument();
$names = json_decode(file_get_contents('namelist.txt'));
foreach ($names as $name)
{
$xml_name = $xml->createElement($name);
}
$xml->save("rss.xml");
?>
我收到以下错误:
Fatal error: Uncaught exception 'DOMException' with message 'Invalid Character Error' in C:\xampp\htdocs\xibo\rss.php:6 Stack trace: #0 C:\xampp\htdocs\xibo\rss.php(6): DOMDocument->createElement('Mr Tony Te...') #1 {main} thrown in C:\xampp\htdocs\xibo\rss.php on line 6
甚至可以这样吗?
编辑 1:
尝试了@spiky 的解决方案,但结果是空白页:
<?php
$obj=('namelist.txt');
function json_to_xml($obj){
$str = "";
if(is_null($obj))
return "<null/>";
elseif(is_array($obj)) {
//a list is a hash with 'simple' incremental keys
$is_list = array_keys($obj) == array_keys(array_values($obj));
if(!$is_list) {
$str.= "<hash>";
foreach($obj as $k=>$v)
$str.="<item key=\"$k\">".json_to_xml($v)."</item>".CRLF;
$str .= "</hash>";
} else {
$str.= "<list>";
foreach($obj as $v)
$str.="<item>".json_to_xml($v)."</item>".CRLF;
$str .= "</list>";
}
return $str;
} elseif(is_string($obj)) {
return htmlspecialchars($obj) != $obj ? "<![CDATA[$obj]]>" : $obj;
} elseif(is_scalar($obj))
return $obj;
else
throw new Exception("Unsupported type $obj");
}
?>
如果解码 JSON 是一个具有两个属性(0
和 1
)的对象。
var_dump(json_decode('{"0":"Mr Tony Test","1":"Ms Tina Testy"}'));
输出:
object(stdClass)#1 (2) {
["0"]=>
string(12) "Mr Tony Test"
["1"]=>
string(13) "Ms Tina Testy"
}
您迭代属性并将值用作元素名称。但它们不是有效名称。这是一个产生错误的静态示例:
$document = new DOMDocument();
$document->createElement('name with spaces');
输出:
Fatal error: Uncaught exception 'DOMException' with message
'Invalid Character Error' in /tmp/...
所以你要确保你生成了一个有效的XML。喜欢这个:
$json = json_decode('{"0":"Mr Tony Test","1":"Ms Tina Testy"}');
$document = new DOMDocument();
$names = $document->appendChild(
$document->createElement('names')
);
foreach ($json as $value) {
$names
->appendChild($document->createElement('name'))
->appendChild($document->createTextNode($value));
}
$document->formatOutput = TRUE;
echo $document->saveXml();
输出:
<?xml version="1.0"?>
<names>
<name>Mr Tony Test</name>
<name>Ms Tina Testy</name>
</names>
最好为 XML 使用可定义的节点结构,而不是数据定义的节点结构。
您将结果 xml 文件命名为 'rss.xml'。 RSS 是一种定义的格式。所以如果你想生成RSS你必须生成特定的节点。
$json = json_decode('{"0":"Mr Tony Test","1":"Ms Tina Testy"}');
$document = new DOMDocument();
$rss = $document->appendChild($document->createElement('rss'));
$rss->setAttribute('version', '2.0');
$channel = $rss->appendChild($document->createElement('channel'));
foreach ($json as $value) {
$item = $channel->appendChild($document->createElement('item'));
$item
->appendChild($document->createElement('title'))
->appendChild($document->createTextNode($value));
}
$document->formatOutput = TRUE;
echo $document->saveXml();
输出:
<?xml version="1.0"?>
<rss version="2.0">
<channel>
<item>
<title>Mr Tony Test</title>
</item>
<item>
<title>Ms Tina Testy</title>
</item>
</channel>
</rss>