通过PHP将不规则XML导入MySQL
我希望你能帮忙。我有一个xml文件要导入到MySQL表中。不幸的是,它不是一个标准的XML文件。有关格式,请参见以下内容:通过PHP将不规则XML导入MySQL,php,mysql,Php,Mysql,我希望你能帮忙。我有一个xml文件要导入到MySQL表中。不幸的是,它不是一个标准的XML文件。有关格式,请参见以下内容: <?xml version="1.0" encoding="UTF-8"?> <DDCCommonData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" source="ECloudConnect" Aud
<?xml version="1.0" encoding="UTF-8"?>
<DDCCommonData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" source="ECloudConnect" AuditDate="2018-11-30T13:11:32.4222315Z">
<CounterNotification>
<Date>2018-11-29T01:48:00</Date>
<MachineModel>Model 123</MachineModel>
<MachineID xsi:nil="true" />
<SerialNumber>CGD67291</SerialNumber>
<SourceDeviceID xsi:nil="true" />
<SourceModelID xsi:nil="true" />
<EncompassID xsi:nil="true" />
<ChargeCounter>
<Counter Mode="PRINT" Color="BLACK" Type="COPY">
<Large>0</Large>
<Small>2043</Small>
</Counter>
<Counter Mode="PRINT" Color="FULL" Type="COPY">
<Large>0</Large>
<Small>0</Small>
</Counter>
<Counter Mode="PRINT" Color="TWIN" Type="COPY">
<Large>0</Large>
<Small>0</Small>
</Counter>
<Counter Mode="PRINT" Color="BLACK" Type="FAX">
<Large>0</Large>
<Small>0</Small>
</Counter>
<Counter Mode="PRINT" Color="FULL" Type="FAX">
<Large>0</Large>
<Small>0</Small>
</Counter>
<Counter Mode="PRINT" Color="TWIN" Type="FAX">
<Large>0</Large>
<Small>0</Small>
</Counter>
<Counter Mode="PRINT" Color="BLACK" Type="PRINT">
<Large>0</Large>
<Small>2470</Small>
</Counter>
<Counter Mode="PRINT" Color="FULL" Type="PRINT">
<Large>0</Large>
<Small>0</Small>
</Counter>
<Counter Mode="PRINT" Color="TWIN" Type="PRINT">
<Large>0</Large>
<Small>0</Small>
</Counter>
<Counter Mode="PRINT" Color="BLACK" Type="LIST">
<Large>0</Large>
<Small>11</Small>
</Counter>
<Counter Mode="PRINT" Color="FULL" Type="LIST">
<Large>0</Large>
<Small>0</Small>
</Counter>
<Counter Mode="PRINT" Color="TWIN" Type="LIST">
<Large>0</Large>
<Small>0</Small>
</Counter>
<Counter Mode="SCAN" Color="BLACK" Type="COPY">
<Large>0</Large>
<Small>1270</Small>
</Counter>
<Counter Mode="SCAN" Color="FULL" Type="COPY">
<Large>0</Large>
<Small>0</Small>
</Counter>
<Counter Mode="SCAN" Color="TWIN" Type="COPY">
<Large>0</Large>
<Small>0</Small>
</Counter>
<Counter Mode="SCAN" Color="BLACK" Type="FAX">
<Large>0</Large>
<Small>21</Small>
</Counter>
<Counter Mode="SCAN" Color="FULL" Type="FAX">
<Large>0</Large>
<Small>0</Small>
</Counter>
<Counter Mode="SCAN" Color="TWIN" Type="FAX">
<Large>0</Large>
<Small>0</Small>
</Counter>
<Counter Mode="SCAN" Color="BLACK" Type="NET">
<Large>1</Large>
<Small>544</Small>
</Counter>
<Counter Mode="SCAN" Color="FULL" Type="NET">
<Large>0</Large>
<Small>0</Small>
</Counter>
<Counter Mode="SCAN" Color="TWIN" Type="NET">
<Large>0</Large>
<Small>0</Small>
</Counter>
</ChargeCounter>
<ErrorHistory xsi:nil="true" />
<DepartmentCodes />
这里有一个黑客。它只是基本上完成了XML文件
<?php
$conn = mysqli_connect("localhost", "root", "test", "info");
$affectedRow = 0;
$file_contents = sprintf("%s</CounterNotification> </DDCCommonData>",file_get_contents("input.xml"));
$xml = simplexml_load_string($file_contents) or die("Error: Cannot create object");
foreach ($xml->children() as $row) {
$MachineModel = $row->MachineModel ;
$SerialNumber= $row->SerialNumber;
$sql = "INSERT INTO counts(MachineModel ,SerialNumber) VALUES ('" . $MachineModel . "','" . $SerialNumber. "')";
$result = mysqli_query($conn, $sql);
if (! empty($result)) {
$affectedRow ++;
} else {
$error_message = mysqli_error($conn) . "\n";
}
}
您的表结构设计得非常糟糕,不建议像这样存储重复的数据,相反,我建议像
CREATE TABLE counts (
id int(9) NOT NULL auto_increment,
modelname varchar(255) NULL,
serialnumber varchar(255) NULL,
counter_color varchar(255) NULL,
counter_type varchar(255) NULL,
counter_small varchar(255) NULL,
counter_large varchar(255) NULL
PRIMARY KEY (id)
) ENGINE=InnoDB;
然后,您可以读取每个计数器元素,并使用颜色和类型属性,将其直接存储到表中,而不是拥有一个巨大的表
$xml = simplexml_load_file("NewFile.xml") or die("Error: Cannot create object");
$sql = "INSERT INTO counts(MachineModel ,SerialNumber, counter_color, counter_type
counter_small, counter_large)
VALUES (?,?,?,?,?,?)";
$stmt = mysqli_prepare($conn, $sql) or die(mysqli_error($conn));
foreach ($xml->CounterNotification as $row) {
$MachineModel = $row->MachineModel ;
$SerialNumber= $row->SerialNumber;
echo $MachineModel."/".$SerialNumber.PHP_EOL;
foreach ( $row->ChargeCounter->Counter as $counter ) {
mysqli_stmt_bind_param($stmt, "ssssss", $MachineModel, $SerialNumber,
$counter['Color'], $counter['Type'], $counter->Small, $counter->Large);
$result = mysqli_execute($stmt);
if (! empty($result)) {
$affectedRow ++;
} else {
$error_message = mysqli_error($conn) . "\n";
}
}
}
无论如何,您可以添加到XML文件的末尾吗?没有不规则的。只有有效和无效。这是后者。@jbrahy是的,我可以将其添加到XML文件的末尾。你能帮忙吗?谢谢,但我希望每个大的和小的列$counter->large和$counter->small都是单独的值,如果我不知道你想要的列,除了显示值,我应该如何处理它们。我更新了原始帖子,请看一看。谢谢。在很多情况下,OP可能发布了更大文件的一部分。因此,尽管这可能有助于读取样本数据,但它并没有解决读取其他数据的主要问题。
CREATE TABLE counts (
id int(9) NOT NULL auto_increment,
modelname varchar(255) NULL,
serialnumber varchar(255) NULL,
counter_color varchar(255) NULL,
counter_type varchar(255) NULL,
counter_small varchar(255) NULL,
counter_large varchar(255) NULL
PRIMARY KEY (id)
) ENGINE=InnoDB;
$xml = simplexml_load_file("NewFile.xml") or die("Error: Cannot create object");
$sql = "INSERT INTO counts(MachineModel ,SerialNumber, counter_color, counter_type
counter_small, counter_large)
VALUES (?,?,?,?,?,?)";
$stmt = mysqli_prepare($conn, $sql) or die(mysqli_error($conn));
foreach ($xml->CounterNotification as $row) {
$MachineModel = $row->MachineModel ;
$SerialNumber= $row->SerialNumber;
echo $MachineModel."/".$SerialNumber.PHP_EOL;
foreach ( $row->ChargeCounter->Counter as $counter ) {
mysqli_stmt_bind_param($stmt, "ssssss", $MachineModel, $SerialNumber,
$counter['Color'], $counter['Type'], $counter->Small, $counter->Large);
$result = mysqli_execute($stmt);
if (! empty($result)) {
$affectedRow ++;
} else {
$error_message = mysqli_error($conn) . "\n";
}
}
}