我正在尝试使用以下代码读取和解析 XML 文件,但是我遇到了几个问题,第一个问题是状态变量和其他已知的填充变量没有导入到 MYSQL 表中,不知道为什么。我所有的表和列都是 varchar(255)。
第二个问题是记录总数停在50条,没有错误或任何东西。不知道为什么仅 CA 状态就有数百条记录,并且该脚本应该循环遍历所有状态,然后循环遍历 XML 字符串中的所有项目并将它们插入 MYSQL 表中。
我有点困惑,感谢任何帮助。
<?php
$arr = array("AK", "AL", "AR", "AZ", "CA", "CO", "CT", "DC", "DE", "FL", "GA", "GU", "HI", "IA", "ID", "IL", "IN", "KS", "KY", "LA", "MA", "MD", "ME", "MI", "MN", "MO", "MS", "MT", "NC", "ND", "NE", "NH", "NJ", "NM", "NV", "NY", "OH", "OK", "OR", "PA", "PR", "RI", "SC", "SD", "TN", "TX", "UT", "VA", "VI", "VT", "WA", "WI", "WV", "WY");
foreach ($arr as $value) {
$url ='http://api.votesmart.org/Address.getOfficeByOfficeState?key=04c935d4337616f104e5fc905e9fef2d&officeId=9&stateId='.$value.'&officeTypeId=C';
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url); //getting url contents
$data = curl_exec ($ch); //execule curl request
curl_close($ch);
// read XML data string
$xml = simplexml_load_string($data) or die("ERROR: Cannot create SimpleXML object");
// open MySQL connection
$connection = mysqli_connect("localhost", "xxx", "xxx", "xxx") or die ("ERROR: Cannot connect");
// process node data
// create and execute INSERT queries
foreach ($xml->office->candidate as $item) {
foreach ($xml->office->address as $item2) {
foreach ($xml->office->phone as $item3) {
foreach ($xml->office->notes as $item4) {
$candidateId = $item->candidateId;
$title = mysqli_real_escape_string($connection, $item->title);
$firstName = mysqli_real_escape_string($connection, $item->firstName);
$middleName = mysqli_real_escape_string($connection, $item->middleName);
$nickName = mysqli_real_escape_string($connection, $item->nickName);
$lastName = mysqli_real_escape_string($connection, $item->lastName);
$suffix = mysqli_real_escape_string($connection, $item->suffix);
$type = $item2->type;
$typeId = $item2->typeId;
$street = $item2->street;
$city = $item2->city;
$state = $item->state;
$zip = $item2->zip;
$phone1 = $item3->phone1;
$phone2 = $item3->phone2;
$fax1 = $item3->fax1;
$fax2 = $item3->fax2;
$tollFree = $item3->tollFree;
$ttyd = $item3->ttyd;
$cellphone = $item3->cellphone;
$contactName = $item4->contactName;
$contactTitle = $item4->contactTitle;
$sql = "INSERT INTO address (candidateId, title, firstName, middleName, nickName, lastName, suffix, type, typeId, street, city, state, zip, phone1, phone2, fax1, fax2, tollFree, ttyd, cellphone, contactName, contactTitle) VALUES ('$candidateId', '$title', '$firstName', '$middleName', '$nickName', '$lastName', '$suffix', '$type', '$typeId', '$street', '$city', '$state', '$zip', '$phone1', '$phone2', '$fax1', '$fax2', '$tollFree', '$ttyd', '$cellphone', '$contactName', '$contactTitle') ON DUPLICATE KEY UPDATE title = '$title', firstName = '$firstName', middleName = '$middleName', nickName = '$nickName', lastName = '$lastName', suffix = '$suffix', type = '$type', typeId = '$typeId', street = '$street', city = '$city', state = '$state', zip = '$zip', phone1 = '$phone1', phone2 = '$phone2', fax1 = '$fax1', fax2 = '$fax2', tollFree = '$tollFree', ttyd = '$ttyd', cellphone = '$cellphone', contactName = '$contactName', contactTitle = '$contactTitle'";
mysqli_query($connection, $sql) or die ("ERROR: " .mysqli_error($connection) . " (query was $sql)");
}
}
}
}
// close connection
mysqli_close($connection);
}
?>
最佳答案
乍一看,我无法判断您拥有的数据是否有问题,但对于您所做的 foreach 迭代,存在问题:
foreach ($xml->office->candidate as $item) {
foreach ($xml->office->address as $item2) {
对 $xml->office->candidate
的外部迭代导致 $item
表示 first 的所有 candidate 元素 office 元素。这个数字很可能会停留在 50 个,因为有 54 个州,而且可能并非所有州都设有办事处。
快速检查确实显示,这 54 个文件的 第一 办公室元素中有 50 个候选条目。
因此,您更有可能希望以不同的方式堆叠 foreach-es。
foreach ($xml->office as $office) {
foreach ($office->candidate as $candidate) {
...
}
}
仅此级别就已经显示了这 54 个 XML 中所有 office 元素(不仅是第一个)中的 3383 个候选元素仅文档。
当您将这些 foreach-es 的多个级别相互堆叠时,这可能会变得非常复杂,因此您应该从外到内构建它 - 这需要一些规划和一些分步工作。
如果您更喜欢从内到外构建,我建议使用 Xpath 首先获取感兴趣的元素节点,然后使用其他相对的 xpath 查询获取父节点的信息。但这需要xpath方面的知识,不知道你有没有听说过。
无论如何,小心使用 foreach-es 并且很可能选择更好的变量名称应该已经可以帮助您到达目的地了。
关于php - 如何使用 PHP 将 XML 字符串中的值正确插入到 mysql 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30113465/