【问题标题】:Import XML with attributes into mysql将带有属性的 XML 导入 mysql
【发布时间】:2012-12-23 11:04:39
【问题描述】:

我有一个像这样的大 (~30Mb) XML 文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<LIC Version="2.0" Title="Products">
    <Item>
        <Field Name="Filename">/root/_DOWNLOAD/Bird.txt</Field>
        <Field Name="Read_By">Lisa Hannigan</Field>
        <Field Name="Posit">Passenger</Field>
    </Item>
    <Item>
        <Field Name="Filename">D:\03\Strypers.pdf</Field>
        <Field Name="Read_By">Stryper</Field>
        <Field Name="Intensity">2</Field>
        <Field Name="IMG">78</Field>
        <Field Name="Rotate">0</Field>
    </Item>
    <Item>
        <Field Name="Filename">D:\Afriu.txt</Field>
        <Field Name="Read_By">Africano</Field>
        <Field Name="Posit">Canto Africano vol.1</Field>
        <Field Name="File_Resource">mp3</Field>
    </Item>
    <Item>
        <Field Name="Filename">D:\_VARIOUS\Knots.pdf</Field>
        <Field Name="Date">40624</Field>
    </Item>
    ...
</LIC>

我想用 php 脚本将此 xml 导入 mysql 数据库。我用过 SIMPLEXML 和 xpath:

    $url = 'FILE.xml';
    $xml = simplexml_load_file($url);
    $result = $xml->xpath("//Field[@Name]");
foreach { ... }

我需要什么?创建用于mysql sql的数组的正确“foreach”是什么? 请注意,每一行(由“项目”标识)都不相同(不具有相同的“字段名称”)。 对较大的文件使用 simplexml 是否正确? 谢谢你的帮助!

更新

这是一个使用“foreach”的例子,我试过了:

$result = $xml->xpath("//Field[@Name]");    
foreach($result as $key => $value)  {
    echo $value['Name']."=".$value.",";
 }

现在我想了解如何创建要插入 mysql 的字符串

【问题讨论】:

  • 如果你说每个Item可能有不同的Field.Name,我想你可能需要解释一下你的MySQL表结构...
  • 您可以使用XPath读取每个项目,然后使用XPath读取每个字段的名称值,即$item-&gt;xpath("Field[@Name='Read_By']"),然后您可以获取该字段的值。
  • @Passerby : mySQL 表是用所有字段创建的!在我的例子中:CREATE TABLE 'custom' ( IDm` int(30) NOT NULL AUTO_INCREMENT, Filename TEXT, Read_By varchar(240), Posit varchar(255), Intensity varchar(240), IMG TEXT , Rotate varchar(240), File_Resource varchar(240), Date varchar(240),`等等..

标签: php mysql xml


【解决方案1】:
$url = 'FILE.xml';
$xml = simplexml_load_file($url);
for($i=0;$i<count($xml->Item);$i++)
{
   print_r($xml->Item[$i]);
 }

【讨论】:

    【解决方案2】:

    首先创建一个将所有可能的字段匹配为列的表。然后您可以通过LOAD XML LOCAL INFILE query 加载它。

    LOAD XML LOCAL INFILE 'file.xml'
      INTO TABLE person
      ROWS IDENTIFIED BY '<Item>';
    

    【讨论】:

    • 谢谢,但我已经尝试过这个查询,结果是一个所有字段 = NULL 的表
    • @kingmo:注意属性名称与列名称正确对齐。仔细阅读手册链接。
    • 我可以将它与 php 一起使用 - 我无法通过 php 实现它,即使我可以通过终端直接访问将文件导入数据库,我只想通过 web 导入它
    • 是的,您可以通过 php 来完成,前提是您用于访问 php 中的数据库的用户具有 FILE 权限。
    【解决方案3】:

    我试着回答我的问题。

    <?php
        $url = 'FILEXML';
        $xml = simplexml_load_file($url);    
    $i = 1;
      foreach($xml->xpath("/LIC/Item") as $docs)
      {
            foreach($docs->Field as $field) 
            {
                $resultstr[] = $field["Name"];
            }
        $sql_head = headquote($resultstr);
        $sql_ins = "INSERT INTO table_name (";
        $sql_dec = ") VALUE (";
        unset($resultstr);
        $fresult = (array)$docs;
        $fvalue = array_pop($fresult);
        $sql_val = numking($fvalue);
        $sql_end = ");";
        $query_to_use_for_mysql = ($sql_ins.$sql_head.$sql_dec.$sql_val.$sql_end);
    
        unset($fresult);
        unset($fvalue);
     }
     ?>
    

    并添加这两个函数:

    <?php
        function headquote($hdarray) {
                $hdata   = array();
                foreach ( $hdarray as $hdval ) {
                    #       Use backticks instead quotes!
                $hdata[] = "`$hdval`";
                  }
            $hdarray = implode($hdata, ',');
            return $hdarray;
         }
        function numking($input) {
                $data   = array();
                foreach ( $input as $value ) {
                $data[] = is_numeric($value) ? $value : "'".mysql_escape_string($value)."'";
                 }
                $input = implode($data, ',');
                return $input;
          }
    ?>
    

    感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 2013-03-16
      • 1970-01-01
      • 2013-12-31
      • 2015-05-11
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      相关资源
      最近更新 更多