如何使用PHP修改xml文件?使用节点检索新子节点的值并添加它们

时间:2010-06-16 06:43:51

标签: php xml

我已粘贴了我需要的示例: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并阅读文档,但看不清楚它是否正确

3 个答案:

答案 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要将地理位置数据插入
  • 的信息/ 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');
?>

至少对我的问题来说,这种方式非常简单易行。

感谢。