我正在尝试从大型xml文件(每个单元的所有规格的船舶经销商的库存)中挑选元素,并将该数据推送到两个单独的表中。我不知道我是否需要两个Xpath来执行此操作,或者它是否可以压缩为一个。
XML文件包含大约50个元素,每个船只包含子元素,但我想一步一步这一步,直到我得到这样做,并在添加复杂性之前将其保留为三个。 / p>
到目前为止,我使用此previous answer对脚本进行建模并添加了我需要的内容:
<?php
$db = new mysqli('localhost', 'username', 'password', 'database');
$boats=simplexml_load_file("WinboatsWebXMLAllRevA.xml") or die ("Error: Cannot create object");
$values = <<<XPATH
(
|element
|element
|element
)
XPATH;
$pattern_custom = <<<SQL
INSERT INTO pmb_rsdirectory_entries_custom
(
column1, column2, column3
)
VALUES
(
'%s', '%s', '%s'
)
SQL;
foreach ($boats as $boat)
{
$data = $boat->xpath($values);
$escaped = array_map('mysql_real_escape_string', $data);
$query = vsprintf($pattern, $escaped);
$result - mysql_query($query);
if(mysql_errno())
{
printf(
'<h4 style="color: red;">Query Error:</h4>
<p>(%s) - %s</p>
<p>Query:
<pre>%s</pre>
</p>
</hr />',
mysql_errno(),
htmlspecialchars(mysql_errno()),
htmlspecialchars($query)
);
}
}
$values_custom = <<<XPATH
(
|element3
|element4
|element5
)
XPATH;
$pattern_custom = <<<SQL
INSERT INTO pmb_rsdirectory_entries
(
column3, column4, column5
)
VALUES
(
'%s', '%s', '%s'
)
SQL;
foreach ($boats as $boat)
{
$data = $boat->xpath($values_custom);
$escaped = array_map('mysql_real_escape_string', $data);
$query = vsprintf($pattern_custom, $escaped);
$result - mysql_query($query);
if(mysql_errno())
{
printf(
'<h4 style="color: red;">Query Error:</h4>
<p>(%s) - %s</p>
<p>Query:
<pre>%s</pre>
</p>
</hr />',
mysql_errno(),
htmlspecialchars(mysql_errno()),
htmlspecialchars($query)
);
}
}
?>
如果有更好的方法来管理这个问题,我当然愿意接受建议。
更新(XML代码段):
<document>
<node type="boat">
<uniqueid>ID00004146</uniqueid>
<category>Ski and Wakeboard Boat</category>
<boatyear>2015</boatyear>
<make>Malibu</make>
<model>Wakesetter 22 VLX</model>
<length units="feet">22.8</length>
<total>89630.00</total>
<engines>Single</engines>
<enginetype>Other</enginetype>
<fueltype>Gas</fueltype>
<hulltype>Fiberglass reinforced</hulltype>
<engine_manfacturer>Indmar</engine_manfacturer>
<eng_model>Monsoon 350HP 5.7L CAT</eng_model>
<eng_hp>350</eng_hp>
<newused>New</newused>
<availability>Out of Stock</availability>
<options>
<option>Ballast HI FLO - Bow Malibu Launch System</option>
<option>Ballast HI FLO - Rear PNP Plumbing</option>
<option>Pull Up Cleats - Two Pair</option>
<option>Wakesurf Technology (Same Color as Swim Platform)</option>
</options>
<pictures>
<picture>ID00004146_1.jpg</picture>
<picture>ID00004146_2.jpg</picture>
</pictures>
</node>
</document>
答案 0 :(得分:2)
我要做的是在一个foreach循环中获取每个XML行的所有信息,并为两个不同的表填充两个字符串或数组,其中包含INSERT INTO的VALUES子句的信息,然后从foreach运行带有所有行的两个INSERT INTO语句:
INSERT INTO pmb_rsdirectory_entries_custom
(
column1, column2, column3
)
VALUES
(
'value1', 'value2', 'value3'
),
(
'value1', 'value2', 'value3'
) ...
INSERT INTO pmb_rsdirectory_entries
(
column4, column5, column6
)
VALUES
(
'value4', 'value5', 'value6'
),
(
'value4', 'value5', 'value6'
) ...
如果你给我提供一个简短的XML作为例子,我可能会为你构建php代码,但是你很难弄清楚它。 :)
更新(我的PHP脚本版本):
抱歉,我花了一些时间来创建脚本花了我很长时间。这就是我要做的事。
我们假设您要将值uniqueid, category, boatyear, make, model
保存在一个表中,将uniqueid, length, total, engines, enginetype
保存在另一个表中。我已经为两个表添加了唯一ID,但您可能希望使用自动增量字段作为密钥来保持记录链接。这是你的家庭作业。 :)
<?php
$boats = simplexml_load_file( "WinboatsWebXMLAllRevA.xml" ) or die ( "Error: Cannot create object" );
$values = <<<XPATH
(
uniqueid
|category
|boatyear
|make
|model
|length
|total
|engines
|enginetype
)
XPATH;
$valuesFirstTable = array(); //sql row values for the first table
$valuesSecondTable = array(); //sql row values for the second table
foreach ( $boats as $boat )
{
$data = $boat->xpath( $values );
$escaped = array_map( 'mysql_real_escape_string', $data );
$valuesFirstTable[] = "('" . implode( "','", array_slice( $escaped, 0, 5 ) ) . "')"; //includes the uniqueid as first element
$valuesSecondTable[] = "('" . $escaped[0] . "','" . implode( "','", array_slice( $escaped, 5 ) ) . "')";
}
//execute first sql
$values = implode( ',', $valuesFirstTable );
$query = (
"INSERT INTO
t_first_table
(
uniqueid,
category,
boatyear,
make,
model
)
VALUES
{$values}"
);
//this can be a function
$result = mysqli_query( $query );
if ( mysqli_errno() )
{
printf(
'<h4 style="color: red;">Query Error:</h4>
<p>(%s) - %s</p>
<p>Query:
<pre>%s</pre>
</p>
</hr />',
mysqli_errno(),
htmlspecialchars( mysqli_errno() ),
htmlspecialchars( $query )
);
}
//execute second sql
$values = implode( ',', $valuesSecondTable );
$query = (
"INSERT INTO
t_second_table
(
uniqueid,
`length`,
total,
engines,
enginetype,
)
VALUES
{$values}"
);
//this can be a function
$result = mysqli_query( $query );
if ( mysqli_errno() )
{
printf(
'<h4 style="color: red;">Query Error:</h4>
<p>(%s) - %s</p>
<p>Query:
<pre>%s</pre>
</p>
</hr />',
mysqli_errno(),
htmlspecialchars( mysqli_errno() ),
htmlspecialchars( $query )
);
}