我提出了一些函数,但我不相信它们是最好的方法。这是我为建立我所称的头而做的一个,因为我对.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();
}
}