在PHP中导入XML以添加到Mysql数据库

在PHP中导入XML以添加到Mysql数据库,php,mysql,xml,simplexml,Php,Mysql,Xml,Simplexml,我一直在试图破解这个,但就是没能破解 基本上,我有一个包含列车时刻表信息的XML文件,它非常复杂 我需要捕获每一点信息并添加到MySQL数据库中,但正如您将看到的,父/子和键/对是非常动态的,有时它有更多或更少的内容 我一直在寻找SimpleXML,但无法从XML中获取值,因为它可以灵活地适应信息/数据的变化 请注意,从第一次旅行到第二次旅行,有新的字段,正如您可能猜到的,它需要捕获 如何获取以下XLM内部的元素: 以及每种元素,如: OR作为其他值也非常重要 非常感谢 卢西奥 实验性PHP

我一直在试图破解这个,但就是没能破解

基本上,我有一个包含列车时刻表信息的XML文件,它非常复杂

我需要捕获每一点信息并添加到MySQL数据库中,但正如您将看到的,父/子和键/对是非常动态的,有时它有更多或更少的内容

我一直在寻找SimpleXML,但无法从XML中获取值,因为它可以灵活地适应信息/数据的变化

请注意,从第一次旅行到第二次旅行,有新的字段,正如您可能猜到的,它需要捕获

如何获取以下XLM内部的元素:

以及每种元素,如:

OR作为其他值也非常重要

非常感谢

卢西奥

实验性PHP代码:

<?php
$xml = simplexml_load_file($argv[1]) or die("Error: Cannot create object");
//
//  TimeTableID
//
$timetableId = $xml->attributes()->timetableID;
echo "Timetable id: " . $timetableId . "\n\r";
//
// Journey
// I've added the atributes->
foreach ($xml->Journey as $Journey) {
    echo "Journey data: " . $Journey["rid"] . "\n\r";
    echo "Journey data: " . $Journey["uid"] . "\n\r";
    echo "Journey data: " . $Journey["trainId"] . "\n\r";
    echo "Journey data: " . $Journey["ssd"] . "\n\r";
    echo "Journey data: " . $Journey["toc"] . "\n\r";
}
?>
<PportTimetable timetableID="20180124020740">
<Journey rid="201801247176474" uid="G76474" trainId="2H98" ssd="2018-01-24" toc="SN">     
    <OR tpl="BCKNMJC" act="TB" ptd="07:15" wtd="07:15" />
    <IP tpl="BIRKBCK" act="T " pta="07:18" ptd="07:18" wta="07:17:30" wtd="07:18" />
    <PP tpl="CRYSBRJ" wtp="07:20" />
    <IP tpl="CRYSTLP" act="T " plat="1" pta="07:22" ptd="07:22" wta="07:21:30" wtd="07:22" />
    <IP tpl="GIPSYH" act="T " pta="07:25" ptd="07:25" wta="07:24:30" wtd="07:25" />
    <IP tpl="WNORWOD" act="T " plat="1" pta="07:28" ptd="07:28" wta="07:27:30" wtd="07:28" />
    <PP tpl="WNORWDJ" wtp="07:29" />
    <IP tpl="TULSEH" act="T " plat="3" pta="07:31" ptd="07:34" wta="07:31" wtd="07:34" />
    <IP tpl="NDULWCH" act="T " pta="07:37" ptd="07:37" wta="07:36:30" wtd="07:37:30" />
    <IP tpl="EDULWCH" act="T " pta="07:39" ptd="07:40" wta="07:39" wtd="07:40" />
    <IP tpl="PKHMRYC" act="T " plat="2" pta="07:42" ptd="07:43" wta="07:42" wtd="07:43" />
    <IP tpl="PCKHMQD" act="T " plat="1" pta="07:45" ptd="07:45" wta="07:45" wtd="07:45:30" />
    <PP tpl="OLDKRDJ" wtp="07:46" />
    <DT tpl="SBRMNDS" act="TF" pta="07:52" wta="07:52" />
  </Journey>

  <Journey rid="201801248980806" uid="Y80806" trainId="5G45" ssd="2018-01-24" toc="VT" trainCat="EE" isPassengerSvc="false">
    <OPOR tpl="WVRMPTN" act="TB" plat="1" wtd="22:40" />
    <PP tpl="WVRMTNJ" wtp="22:41:30" />
    <PP tpl="WVRMSRJ" wtp="22:44" />
    <OPDT tpl="OXLEYCS" act="TF" wta="22:47" />
  </Journey>
</PportTimetable>
attributes()->timetableID;
echo“时间表id:”$时间表ID。“\n\r”;
//
//旅程
//我已经添加了心房肌->
foreach($xml->旅程作为$旅程){
echo“旅程数据:.”旅程[“rid”]。“\n\r”;
回显“旅程数据:”.$TOWERY[“uid”]。“\n\r”;
echo“旅程数据:”..trainId[“trainId”]。“\n\r”;
回显“旅程数据:”.$TOWERY[“ssd”]。“\n\r”;
回显“旅程数据:”.$toc[“toc”]。“\n\r”;
}
?>
XML文件提取:

<?php
$xml = simplexml_load_file($argv[1]) or die("Error: Cannot create object");
//
//  TimeTableID
//
$timetableId = $xml->attributes()->timetableID;
echo "Timetable id: " . $timetableId . "\n\r";
//
// Journey
// I've added the atributes->
foreach ($xml->Journey as $Journey) {
    echo "Journey data: " . $Journey["rid"] . "\n\r";
    echo "Journey data: " . $Journey["uid"] . "\n\r";
    echo "Journey data: " . $Journey["trainId"] . "\n\r";
    echo "Journey data: " . $Journey["ssd"] . "\n\r";
    echo "Journey data: " . $Journey["toc"] . "\n\r";
}
?>
<PportTimetable timetableID="20180124020740">
<Journey rid="201801247176474" uid="G76474" trainId="2H98" ssd="2018-01-24" toc="SN">     
    <OR tpl="BCKNMJC" act="TB" ptd="07:15" wtd="07:15" />
    <IP tpl="BIRKBCK" act="T " pta="07:18" ptd="07:18" wta="07:17:30" wtd="07:18" />
    <PP tpl="CRYSBRJ" wtp="07:20" />
    <IP tpl="CRYSTLP" act="T " plat="1" pta="07:22" ptd="07:22" wta="07:21:30" wtd="07:22" />
    <IP tpl="GIPSYH" act="T " pta="07:25" ptd="07:25" wta="07:24:30" wtd="07:25" />
    <IP tpl="WNORWOD" act="T " plat="1" pta="07:28" ptd="07:28" wta="07:27:30" wtd="07:28" />
    <PP tpl="WNORWDJ" wtp="07:29" />
    <IP tpl="TULSEH" act="T " plat="3" pta="07:31" ptd="07:34" wta="07:31" wtd="07:34" />
    <IP tpl="NDULWCH" act="T " pta="07:37" ptd="07:37" wta="07:36:30" wtd="07:37:30" />
    <IP tpl="EDULWCH" act="T " pta="07:39" ptd="07:40" wta="07:39" wtd="07:40" />
    <IP tpl="PKHMRYC" act="T " plat="2" pta="07:42" ptd="07:43" wta="07:42" wtd="07:43" />
    <IP tpl="PCKHMQD" act="T " plat="1" pta="07:45" ptd="07:45" wta="07:45" wtd="07:45:30" />
    <PP tpl="OLDKRDJ" wtp="07:46" />
    <DT tpl="SBRMNDS" act="TF" pta="07:52" wta="07:52" />
  </Journey>

  <Journey rid="201801248980806" uid="Y80806" trainId="5G45" ssd="2018-01-24" toc="VT" trainCat="EE" isPassengerSvc="false">
    <OPOR tpl="WVRMPTN" act="TB" plat="1" wtd="22:40" />
    <PP tpl="WVRMTNJ" wtp="22:41:30" />
    <PP tpl="WVRMSRJ" wtp="22:44" />
    <OPDT tpl="OXLEYCS" act="TF" wta="22:47" />
  </Journey>
</PportTimetable>

您可以循环:


感谢您的贡献。我从SimpleXML搬到了xmlReader

这就是我如何回答我自己的问题的方式,可能并不圆滑,但它正在发挥作用:

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$xmlReader = new XMLReader();
// open the file for reading
$xmlReader->open($argv[1]);

// Inittiate var
$rid = "";
$sql_table_name = "";
$number_of_inserts = 0;
    while ($xmlReader->read()) { 
        // check to ensure nodeType is an Element not attribute or #Text  
        if ($xmlReader->nodeType == XMLReader::ELEMENT) {

            if ($xmlReader->hasAttributes) {

                //Reset values to NULL
                $name_values = "";
                $values = "";

                $attribute_count = $xmlReader->attributeCount;
                $sql_counter = 1;
                $sql_table_name = $xmlReader->localName;

                while ($xmlReader->moveToNextAttribute()) {

                    if ($xmlReader->localName == "rid") {
                        $rid = "\"" . $xmlReader->value . "\"";
                    }

                    if ($sql_counter != $attribute_count) {
                        $name_values .= $xmlReader->name . ", ";
                        $values .= "\"" . $xmlReader->value . "\", ";
                    } else {
                        $name_values .= $xmlReader->name;
                        $values .= "\"" . $xmlReader->value . "\"";
                    }

                    $sql_counter++;
                }

                switch ($sql_table_name) {
                    case "Journey":
                        //echo "INSERT INTO " . $sql_table_name . " (" . $name_values . ") VALUES (" . $values . ");" . "\n\r";
                        $sql = "INSERT INTO " . $sql_table_name . " (" . $name_values . ") VALUES (" . $values . ");" . "\n\r";
                        $conn->query($sql);
                        $sql = "";
                        $number_of_inserts++;
                        break;

                    case "Association":
                        // echo "INSERT INTO " . $sql_table_name . " (" . $name_values . ") VALUES (" . $values . ");" . "\n\r";
                        $sql = "INSERT INTO " . $sql_table_name . " (" . $name_values . ") VALUES (" . $values . ");" . "\n\r";
                        $conn->query($sql);
                        $sql = "";
                        $number_of_inserts++;
                        break;

                    case "main":
                        // echo "INSERT INTO " . $sql_table_name . " (" . $name_values . ") VALUES (" . $values . ");" . "\n\r";
                        $sql = "INSERT INTO " . $sql_table_name . " (" . $name_values . ") VALUES (" . $values . ");" . "\n\r";
                        $conn->query($sql);
                        $sql = "";
                        $number_of_inserts++;
                        break;

                    case "assoc":
                        // echo "INSERT INTO " . $sql_table_name . " (" . $name_values . ") VALUES (" . $values . ");" . "\n\r";
                        $sql = "INSERT INTO " . $sql_table_name . " (" . $name_values . ") VALUES (" . $values . ");" . "\n\r";
                        $conn->query($sql);
                        $sql = "";
                        $number_of_inserts++;
                        break;

                    default:
                        $name_values = "rid, " . $name_values;
                        $values = $rid . ", " . $values;

                        if ($sql_table_name == "OR") {
                            $sql_table_name = "`" . $sql_table_name . "`";
                        }
                        // echo "INSERT INTO " . $sql_table_name . " (" . $name_values . ") VALUES (" . $values . ");" . "\n\r";
                        $sql = "INSERT INTO " . $sql_table_name . " (" . $name_values . ") VALUES (" . $values . ");" . "\n\r";
                        $conn->query($sql);
                        $sql = "";
                        $number_of_inserts++;
                }
            }

        }

    }
    $conn->close();

考虑MySQL的
加载XML
功能,它可以将XML数据直接导入数据库,类似于
加载CSV
。但是,您需要扁平化和简化XML以适应不同的需求。幸运的是,有一个很好的工具可以用来转换这样一种以属性为中心的XML:,这是一种专门用于转换XML文件以满足最终使用需求的专用语言。PHP可以用它的类运行XSLT1.0脚本

特别是下面的XSLT提取所有
属性。如果它们作为根节点的子节点驻留,则可以将XSLT中的旅程更改为其他路径:Association、main等。当然,确保您的MySQL目标表具有来自XML的所有可能字段

XSLT(另存为.xsl文件)


PHP(无循环或if语句)

//加载XML和XSL源
$doc=新的DOMDocument();
$doc->load('Input.xml');
$xsl=新文档;
$xsl->load('XSLT_Script.xsl');
//配置变压器
$proc=新的XSLTProcessor;
$proc->importStyleSheet($xsl);
//变换源
$newXml=$proc->transformToXML($doc);
//保存到文件
文件内容('Output.xml',$newXml);
//运行MYSQL命令(可能需要在设置中允许--local infle)
试一试{
$conn=newmysqli($servername、$username、$password、$dbname);
$conn->query(“加载XML数据填充'path/to/Output.XML'
进桌之旅
由“;”标识的行;
}捕获(例外$e){
echo$e->getMessage();
}
$conn->close();
XML(转换后的输出传递到加载XML)


201801247176474
G76474
2H98
2018-01-24
锡
201801248980806
Y80806
5G45
2018-01-24
及物动词
EE
假的

如果PHP代码被标记为PHP,则还需要包含PHP代码。
// LOAD XML AND XSL SOURCES
$doc = new DOMDocument();
$doc->load('Input.xml');

$xsl = new DOMDocument;
$xsl->load('XSLT_Script.xsl');

// CONFIGURE TRANSFORMER
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); 

// TRANSFORM SOURCE
$newXml = $proc->transformToXML($doc);

// SAVE TO FILE
file_put_contents('Output.xml', $newXml);

// RUN MYSQL COMMAND (MAY NEED TO ALLOW --local-infile IN SETTINGS)
try {
   $conn = new mysqli($servername, $username, $password, $dbname);
   $conn->query("LOAD XML DATA INFILE 'path/to/Output.xml'
                 INTO TABLE Journey
                 ROWS IDENTIFIED BY '<row>';");
} catch(Exception $e) {  
    echo $e->getMessage();  
}

$conn->close();
<?xml version="1.0" encoding="utf-8"?>
<data>
  <row>
    <rid>201801247176474</rid>
    <uid>G76474</uid>
    <trainId>2H98</trainId>
    <ssd>2018-01-24</ssd>
    <toc>SN</toc>
  </row>
  <row>
    <rid>201801248980806</rid>
    <uid>Y80806</uid>
    <trainId>5G45</trainId>
    <ssd>2018-01-24</ssd>
    <toc>VT</toc>
    <trainCat>EE</trainCat>
    <isPassengerSvc>false</isPassengerSvc>
  </row>
</data>