Php 如何编辑我的代码以从XML开始保存到mySQL?

Php 如何编辑我的代码以从XML开始保存到mySQL?,php,mysql,simplexml,Php,Mysql,Simplexml,我在下面有一个XML提要,我正在尝试为所有产品导入MySQL。 例如,在表XML_提要中,我希望 shop - product_id - product_name - product_link - ....... mywebstore - 322233 - MadBiker 600 - ......... mywebstore - 324633 - Samsung S4 - ......... 到目前为止,只有当XML从而不是从开始时,代码才起作用

我在下面有一个XML提要,我正在尝试为所有产品导入MySQL。 例如,在表XML_提要中,我希望

shop        -   product_id - product_name - product_link - .......
mywebstore  -   322233     - MadBiker 600 - .........
mywebstore  -   324633     - Samsung S4 - .........
到目前为止,只有当XML从而不是从开始时,代码才起作用

如何更改我的代码来执行此操作

$xml = simplexml_load_file("test.xml");
foreach($xml->product as $product)
{
    $columns = array();
    $data = array();
    foreach($product->children() as $child)
    {
        echo $child->getName() . ": " . $child . "<br />";
        $columns[] = $child->getName();
        $data[] = mysql_real_escape_string((string)$child);
    }
    $col = '`'. implode('`,`',$columns) .'`';
    $val = "'". implode("','",$data)."'";
    $query = "INSERT INTO XML_FEED ($col) VALUES ($val)";
    echo $query;

    mysql_query($query);
}
以下是XML:

<?xml version="1.0" encoding="UTF-8"?>
<mywebstore>
   <created_at>2010-04-08 12:32</created_at>
   <products>
      <product>
        <id>322233</id>
        <name><![CDATA[MadBiker 600]]></name>
        <link><![CDATA[http://www.mywebstore.co.uk/product/322233]]></link>
        <image><![CDATA[http://www.mywebstore.co.uk/product/322233.jpg]]></image>
        <category><![CDATA[Outdor > Extreme Sports]]></category>
        <price_with_vat>322.33</price_with_vat>
      </product>
      ...
      ...
      ...
   </products>
</mywebstore>

这应该适合您:

<?php

    //Xml stuff
    $xml = simplexml_load_file("file.xml");

    //Database stuff
    $hostname = "localhost";
    $username = "root";
    $password = "";

    try {
        //DB Connection
        $dbh = new PDO("mysql:host=$hostname;dbname=dbname", $username, $password);
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        echo "Connected to Database<br/>";


        foreach($xml->products->product as $data) {
            $sql = "INSERT INTO XML_FEED (shop, product_id, product_name, product_link, product_image, product_category, product_price_with_vat)
                VALUES (:SHOP, :ID, :NAME, :LINK, :IMAGE, :CATEGORY, :PRICE)";
            $stmt = $dbh->prepare($sql);

            $params = array(
                "SHOP" => $xml->getName(),
                "ID" => $data->id ,
                "NAME" => $data->name,
                "LINK" => $data->link,
                "IMAGE" => $data->image,
                "CATEGORY" => $data->category,
                "PRICE" => $data->price_with_vat
            );
            $stmt->execute($params);

        }

        //Close Connection
        $dbh = null;

    } catch(PDOException $e) {
        echo $e->getMessage();
    }

?>
网站说明:

将错误报告添加到文件顶部,这将在生产测试期间有所帮助

<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
?>
此外,如果您想以html格式显示/查看数据,您可以使用:

<?php

    //Xml stuff
    $xml = simplexml_load_file("file.xml");

    echo "<table border='1'>";

    echo "<tr>
            <td>Shop</td>
            <td>Product ID</td>
            <td>Product Name</td>
            <td>Product Link</td>
            <td>Product Image</td>
            <td>Product Category</td>
            <td>Product Price with vat</td>
        </tr>";

    foreach($xml->products->product as $data) {
        echo "<tr>
            <td>" . $xml->getName() . "</td>
            <td>" . $data->id . "</td>
            <td>" . $data->name . "</td>
            <td>" . $data->link . "</td>
            <td>" . $data->image . "</td>
            <td>" . $data->category . "</td>
            <td>" . $data->price_with_vat. "</td>
        </tr>";
    }

    echo "</table>";

?>

由于缺少父节点或父节点无效,无法获取数据

在使用XML时,需要处理父节点和子节点 关系要小心。不幸的是,你错过了同样的机会 事情

当您使用mywebstore节点作为父节点时,其中间子节点是products,而products子节点是product。 但当您将products节点用作父节点时,其子节点就是product。 在代码中,您已经处理了第二个条件。您必须处理这两个条件,或者可以在代码中使用第一个条件

例如:

XML:

将属性ID为的父节点XML格式化为: `

将不带属性ID的作为父节点XML的格式与问题XML相同: `

`

将属性ID为的父节点XML格式化为: `

`

格式为不带attributeID的父节点XML: `

结论:在有效处理父节点和子节点关系时。

只需更改以下内容:

foreach($xml->product as $product)
{
为此:

foreach($xml->products[0] as $product)
{
首先,simplexml_load_文件返回指向XML提要根元素的指针,即输入文件中的第一个XML标记。换句话说,当你写作时:

$xml = simplexml_load_file("test.xml");
如果test.xml包含。。。然后,$xml指向 如果test.xml包含。。。然后,$xml指向 其次,$xml->[tagName]只查找直接子对象,而不是递归查找。因此,$xml->product仅在标记作为根元素的子元素存在时才查找某些内容

通常,代码最好与输入结构精确匹配。使外部循环适应预期输入:

foreach($xml->product as $product) {
    ...
}

如果出于某种原因,标记可能位于输入XML提要中的不同位置,则可以分两步进行:

// try to locate the <product> nodes
if (count($xml->product) !== 0) {
    $productNodes = $xml->product;
} else if (count($xml->products->product) !== 0) {
    $productNodes = $xml->products->product;
} else {
    throw new Exception('No <product> node found');
}

// do the job
foreach($productNodes as $product){
    ...
}
我相信MySQL部分不是一个问题,所以我将坚持通常的咒语:

。它们不再得到维护。看到了吗?相反,学习,并使用or-将帮助您决定哪一个。如果您选择PDO

使用此代码:

<?php

$xml = simplexml_load_file('test.xml');

foreach($xml->products->product as $product)
{
    $columns = array();
    $data = array();
    foreach($product->children() as $child)
    {
        echo $child->getName() . ": " . $child . "<br />";
        $columns[] = $child->getName();
        $data[] = mysql_real_escape_string((string)$child);
    }
    $col = '`'. implode('`,`',$columns) .'`';
    $val = "'". implode("','",$data)."'";
    $query = "INSERT INTO XML_FEED ($col) VALUES ($val)";
    echo $query;

    mysql_query($query);
}
?>

为了得到不同的产品,你应该使用

代码:

}

说明:

XPathforSimpleXML只返回一个简单xml对象数组,这里是产品xml元素

因为我们希望返回所有产品的数组,所以我们使用xpath搜索产品的每一次出现


在xpath字符串内部,双斜杠//表示返回XML文档中与搜索条件匹配的所有元素,无论文档中的位置/级别如何。

我不认为你可以通过悬赏来补偿低质量的问题。你可以……但我认为如果你展示一些你尝试过的例子,你可能会停止获得否决票。这是stackoverflow,你在一个你应该先发布代码的网站上公开要求代码。。。你试过什么了?这个问题不应该有一个公开的悬赏,因为它很可能是一个重复的问题。如果你能把它标记为双重悬赏。这很简单,对吧?@也许我理解这一点,我已经更新了我的代码。你的答案一点也不完整!你错过了一半的问题。OP还想在他的数据库中插入日期,而您没有连接,也没有查询执行。另外,从PHP 5.5.0开始,mysql_*扩展名已被弃用,并将在将来被删除。@Rizier123问题在于正确解析xml文件。我已经提供了同样的解决方案。我使用了提问者使用的相同mysql*方法。我相信提问者会按照他的库要求插入数据,就像他可能使用PDO或MySQLi一样。@Rizier123如果你想测试解决方案,请评论$value=mysql\u real\u escape\u string$value;用我在answer.MAn中提供的两种xml,他只说他不想从中获取数据。就是这样。仅根据您的评论。他在问题中指出,到目前为止,只有当XML从开始而不是从开始时,代码才有效。还有同样的解决方案。为什么要投否决票?请解释一下,这样我可以改进/更改我的答案。我可以为将来学习它
foreach($xml->products[0] as $product)
{
$xml = simplexml_load_file("test.xml");
foreach($xml->product as $product) {
    ...
}
foreach($xml->products->product as $product) {
    ...
}
// try to locate the <product> nodes
if (count($xml->product) !== 0) {
    $productNodes = $xml->product;
} else if (count($xml->products->product) !== 0) {
    $productNodes = $xml->products->product;
} else {
    throw new Exception('No <product> node found');
}

// do the job
foreach($productNodes as $product){
    ...
}
$productNodes = $xml->xpath('//product');

foreach($productNodes as $product){
    ...
}
<?php

$xml = simplexml_load_file('test.xml');

foreach($xml->products->product as $product)
{
    $columns = array();
    $data = array();
    foreach($product->children() as $child)
    {
        echo $child->getName() . ": " . $child . "<br />";
        $columns[] = $child->getName();
        $data[] = mysql_real_escape_string((string)$child);
    }
    $col = '`'. implode('`,`',$columns) .'`';
    $val = "'". implode("','",$data)."'";
    $query = "INSERT INTO XML_FEED ($col) VALUES ($val)";
    echo $query;

    mysql_query($query);
}
?>
$xml = simplexml_load_file("xml.xml");

// will search for array of products no matter what it is nested inside of
$products = $xml->xpath('//product'); 

foreach($products as $product)
{
    $columns = array();
    $data = array();
    foreach($product->children() as $child)
    {
        echo $child->getName() . ": " . $child . "<br />";
        $columns[] = $child->getName();
        $data[] = mysql_real_escape_string((string)$child);
    }
    $col = '`'. implode('`,`',$columns) .'`';
    $val = "'". implode("','",$data)."'";
    $query = "INSERT INTO XML_FEED ($col) VALUES ($val)";
    echo $query;

   mysql_query($query);