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 ファイルでテストしているため、ご覧のとおり、関数には「本」という単語が含まれています。そこにある任意の .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 に答える