0

我想出了一些功能,但我不相信它们是最好的方法。这是我为建立我所说的标题而制作的一个,因为我对 .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 文件),一个用于计算我称之为“项目”的函数目前将返回零...

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

这不合适,因为它使用“Row”,而且我的 .xml 文件中没有名为“Row”的元素。

所以我发现自己想知道是否应该使用 eval() 之类的函数来执行相同的代码行,或者是否应该考虑更多 SimpleXML 方法或其他 PHP 函数?

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

这是我的书 .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 文件都将完全不同,因此没有函数可以使用该列表或“目录”或“书籍”中的任何项目。也许我已经说得很清楚了。

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

4

1 回答 1

0

没有一种方法是“神奇的”。您只是无法编写适合任何 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将 XML 树转换为您需要提前知道属性名称的对象(或者您需要使用自省)。

相反,请尝试使用常规 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();
   }
}
于 2013-07-25T23:19:52.923 回答