使用php导入许多xml文件的最佳方法是先不知道任何xml文件的格式


Best way to import many xml files using php without knowing any of the xml files format first?

我提出了一些函数,但我不相信它们是最好的方法。这是我为建立我所称的头而做的一个,因为我对.csv文件做了同样的事情,$headers数组用于创建数据库表,头是列名。我想对.xml文件做同样的操作。。。

function ecsvi_XML_establish_headers($xmlpath){
if( ! $xml3 = simplexml_load_file( $xmlpath ) ) { 
    return false;     
} else { 
    $headers = array();
    foreach( $xml3->book[0]->attributes() as $a => $b ) { 
        $headers[] = $a;
    } 
    foreach( $xml3 as $header => $book ) { 
        foreach($book as $node => $value){
            $headers[] = $node;
        }
        break;
    }
    return $headers;
} 

我正在使用一个包含书籍的.xml文件进行测试,因此您可以看到该函数包含单词"book"。这是不合适的,因为它需要处理任何.xml文件。

由于显而易见的原因(如果您认为我们使用的是任何.xml文件),用于计算我所称的"项"(items)以概括事物的函数目前将返回零。。。

function ecsvi_XML_count_number_of_items($xmlpath){
    $table = new SimpleXMLElement(file_get_contents($xmlpath));
    return count($table->Row); 
}

这是不合适的,因为它使用了"Row",而且我的.xml文件中没有名为"Row(行)"的元素。

所以我发现自己在想,我是否应该使用eval()这样的函数来执行相同的代码行,或者是否有一种更简单的XML方法或其他我应该考虑的PHP函数?

我见过一些接口输出.xml文件内容,然后用户选择属性和节点等来告诉应用程序该做什么。如果可能的话,我希望避免这种情况。目标是将任何.xml导入到基于该文件创建的数据库表中。脚本不知道内容、元素、节点、子项等。

这是我的book.xml文件。。。

<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>

$headers输出一个具有以下内容的数组。。。

*id
*author
*title
*genre
*price
*publish_date
*description

我需要这个标题列表来为这个.xml文件创建一个数据库表。每个导入的.xml文件都是完全不同的,因此没有任何函数可以使用该列表、"目录"或"书籍"中的任何项。也许我已经说得很清楚了。

感谢您对最佳方法和现有来源的任何建议,这些建议可以帮助我确定合适的方法。

没有方法是"魔术";。你根本无法编写一个适合任何XML格式。

这就像在问:"我想写一个视频播放器,它将能够读取任何视频编解码器,即使是尚未实现的编解码器"

因此,首先,您需要减少应用领域:当你说:";任何XML格式";。

第一:您为什么需要导入";任何";XML文件以表格方式显示?大多数XML文件根本没有表格结构,也没有办法将其放入类似表格的结构中。

谁向您提供这些XML文件?为了什么目的?他们能提供一个预期模式的列表,这样你就可以找到一个模式吗?

例如,如果你知道你的所有文件都将是一个";表格";形式的XML格式

<first-level-element-we-dont-care>
    <item-element> 
        <header-name-1>some-value</header-name-1>
        <header-name-2>some value</header-name-2>
        <header-name-3>some value</header-name-3>
    </item-element>
    <item-element> 
        <header-name-1>some-value</header-name-1>
        <header-name-2>some value</header-name-2>
        <header-name-3>some value</header-name-3>
    </item-element>
</first-level-element-we-dont-care>

然后你可以做点什么。。。

首先,使用SimpleXML在这里不起作用,因为SimpleXML

相反,请尝试使用常规的DOM API:https://www.php.net/dom然后您可以在伪代码中执行以下操作:

topEl = doc.rootElement();
firstItem = topEl.children()[0];
headers = [];
foreach(headerEl : firstItem.children()) {
   header.add(headerEl.tagName()); 
}
items = [];
foreach(itemEl : topEl.children()) {
   items.add([]); 
   foreach(header : headers) {
      items[-1][header] = itemEl.getElementByTagName(header).value();
   }
}