我有一个看起来像这样的数据库行。
ID (int): 123
Name (string): SomeName
Data (string): <data><foo>one</foo></bar>two</bar></data>
我需要按以下方式将此数据格式化为XML。
<row>
<id>123</id>
<name>SomeName</name>
<data>
<foo>one</foo>
<bar>two</bar>
</data>
<row>
我目前正在使用SimpleXML来尝试构建它,但我不确定如何将现有的XML插入到我正在尝试构建的新XML文档中。
如果PHP附带其他标准XML构建器,我也可以使用它们。字符串连接不是可接受的答案。
编辑:看起来好像SimpleXML不会做我需要的。我想在这一点上,我需要其他XML解析器的建议。
答案 0 :(得分:2)
$xml = new SimpleXMLElement('<row></row>');
$xml->addChild('id', /*database ID column*/);
$xml->addChild('name', /*database Name column*/);
$data = new SimpleXMLElement(/*database Data column*/);
$xml->addChild('data');
$xml->data->addChild('foo', $data->foo);
$xml->data->addChild('bar', $data->bar);
经过测试,确实有效。将它转换为您的实际应用程序应该是微不足道的。可能有一种更灵活的方式,但我不知道。他们没有把它称为SimpleXML:)
答案 1 :(得分:0)
$xml = '<data><foo>one</foo><bar>two</bar></data>'; // your data field
$row = new SimpleXMLElement('<row></row>'); // new row to inject your database fields into
$data = new SimpleXMLElement($xml); // new object from your xml data field
$row->id = '123'; // your id field
$row->name = 'Somename'; // your name field
$row->data->foo = $data->foo; // your foo record from your xml data field
$row->data->bar = $data->bar; // your bar record from your xml data field
$final_xml = $row->saveXML(); // restructure your xml file/string
echo $final_xml; // <?xml version="1.0"?><row><id>123</id><name>Somename</name><data><foo>one</foo><bar>two</bar></data></row>
测试了这段代码,它也有效。
你必须创建两个SimpleXml对象,如上面的答案。除此之外,你可以添加
其他元素,如添加类变量。 <?xml version="1.0"?>
将添加到最终的xml字符串/文件中。
不确定您是否需要<?xml version="1.0"?>
。
如果没有,你可以把它拿出来:
$final_xml = str_replace("<?xml version=\"1.0\"?>\n",'',$final_xml);
有关将SimpleXml对象重新保存回xml字符串/文件的详细信息,可以查看http://www.php.net/manual/en/simplexmlelement.asxml.php。
答案 2 :(得分:0)
/**
* Converts your record to XML.
*
* @param array/object $record
* @return SimpleXMLElement
*/
function ConvertToXml($record){
// Objects need to be arrays
if(is_object($record)){
$record = get_object_vars($record);
}
// We need an array argument
if(!is_array($record)){
trigger_error('$record must be an object or an array.', E_USER_WARNING);
return null;
}
// Now we build XML
ob_start();
echo '<xml>', PHP_EOL;
foreach($record as $name => $value){
if(is_object($value) or is_array($value) or is_resource($value)){
trigger_error('$record must have only scalar values.', E_USER_WARNING);
return null;
}
if(!is_string($name) or !preg_match('~[a-z_][a-z0-9]*~i', $name)){
trigger_error('$record must have only XML-tag friendly string keys.', E_USER_WARNING);
return null;
}
// NULL produces an empty node
if(is_null($value)){
echo "<{$name} />", PHP_EOL;
continue;
}
// Numerics don't need to be XML encoded
if(is_integer($value) or is_float($value) or is_bool($value)){
echo "<{$name}>{$value}</{$name}>", PHP_EOL;
continue;
}
// We must have a string now
if(!is_string($name)){
trigger_error('$record must have only scalar values.', E_USER_WARNING);
return null;
}
// Do we have an XML field?
if(preg_match('~^\s*<.+>\s*$~s', $value)){
// Test it for real!
if($xml = @simplexml_load_string("<xml>{$value}</xml>")){
echo $value, PHP_EOL;
continue;
}
}
// Now output random strings
echo "<{$name}>", htmlentities($value, ENT_QUOTES, 'utf-8'), "</{$name}>", PHP_EOL;
}
echo '</xml>', PHP_EOL;
// Store built XML
$xml = ob_get_clean();
// Load the built XML
return @simplexml_load_string($xml);;
}
// Prepare an array
$record = array();
$record['ID'] = 1;
$record['Name'] = 'SomeName';
$record['Data'] = '<data><foo>one</foo><bar>two</bar></data>';
if($xml = ConvertToXml($record)){
echo $xml->asXML();
}
^ 后代的答案。