我已粘贴了我需要的示例:http://pastie.org/1005178
我有一个xml文件,上面写着以下信息
<state>
<info>
<name>hello</name>
<zip>51678</zip>
</info>
<info>
<name>world</name>
<zip>54678</zip>
</info>
</state>
现在我需要创建一个具有以下
的新xml文件<state>
<info>
<name>hello</name>
<zip>51678</zip>
<lat>17.89</lat>
<lon>78.90</lon>
</info>
<info>
<name>world</name>
<zip>54678</zip>
<lat>16.89</lat>
<lon>83.45</lon>
</info>
</state>
所以,基本上我需要为每个info元素添加lat和lon节点。 这些lat和lon对应于存储在mysql文件中的邮政编码,该文件包含3个字段 - pin,lat和lon
我如何递归地执行此操作。我在文件中说了1000个信息元素
请给我一个示例代码,因为我已经尝试过使用simplexml并阅读文档,但看不清楚它是否正确
答案 0 :(得分:2)
根据您在问题中提供的XML(而不是pastebin),您可以使用DOM来完成此操作:
$xml = <<< XML
<state>
<info>
<name>hello</name>
<zip>51678</zip>
</info>
<info>
<name>world</name>
<zip>54678</zip>
</info>
</state>
XML;
下面的代码会将XML加载到DOMDocument
实例中。然后我们在其上调用自定义函数insertGeo()
并以干净的格式输出结果:
$dom = new DOMDocument;
$dom->preserveWhiteSpace = FALSE;
$dom->formatOutput = TRUE;
$dom->loadXML($xml); // use ->load('filename') for files
insertGeo($dom, 51678, 1, 2);
echo $dom->saveXML(); // use ->save('filename') for files
自定义函数接受四个参数:
$dom
DOMDocument实例$zip
要将地理位置数据插入$lat
/ $lon
纬度和经度在代码中:
function insertGeo($dom, $zip, $lat, $lon) {
$xpath = new DOMXPath($dom);
$nodes = $xpath->query(sprintf('//info/zip[text() = "%s"]', $name));
foreach($nodes as $node) {
$info = $node->parentNode;
$info->appendChild($dom->createElement('lat', $lat));
$info->appendChild($dom->createElement('lon', $lon));
}
}
它的作用是使用XPath查询DOMDocument,以查找值为$zip
的信息节点下的所有zip节点。然后,它将遍历结果列表并获取信息节点。然后它将创建并附加lat / lon节点。就这样。如果要查询Name元素而不是Zip,只需相应地更改XPath。
结果:
<?xml version="1.0"?>
<state>
<info>
<name>hello</name>
<zip>51678</zip>
<lat>1</lat>
<lon>2</lon>
</info>
<info>
<name>world</name>
<zip>54678</zip>
</info>
</state>
您现在要做的就是将所有地理数据放入一个数组中,这样您就可以对其进行预测并将值传递给insertGeo
函数。
答案 1 :(得分:1)
我会在数组中加载所有地理定位信息(我假设“pin”是邮政编码?),然后遍历<info/>
个节点并插入相应的<lon/>
和{{ 1}}。
<lat/>
答案 2 :(得分:0)
以下是我用来编辑xml的PHP脚本:
<?php
//Contact Code Author : avinashsonee@gmail.com
//DB Connection Parameters
$dbHost = 'localhost'; // usually localhost
$dbUsername = 'root';
$dbPassword = '';
$dbDatabase = 'demo';
//DB Connection Start
$db = mysql_connect($dbHost, $dbUsername, $dbPassword) or die ("Unable to connect to Database Server.");
mysql_select_db ($dbDatabase, $db) or die ("Could not select database.");
//Since we're already using PHP5, why don't we exploit their easy to use file_get_contents() command?
$xmlFileData = file_get_contents("demo.xml");
//Here's our Simple XML parser!
$xmlData = new SimpleXMLElement($xmlFileData);
//And here's the output.
foreach ($xmlData->Info as $City)
{
foreach($City->zip as $izip)
{
$sql = "SELECT lat,lon FROM ascii WHERE zip LIKE '$izip'";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
echo $izip, ", ", $row[0],", ", $row[1],"<br/>";
$book->addChild('lat',$row[0]);
$book->addChild('lon',$row[1]);
}
}
echo $xmlData->asXML();
$xmlData->asXML('updated_demo.xml');
?>
至少对我的问题来说,这种方式非常简单易行。
感谢。