0

次のようなデータを含む XML ファイルがあります。

<?xml version="1.0" encoding="utf-8"?>
<countries>
    <country id="Canada">
        <location>
            <code>CAXX0001</code>
            <name>Abbotsford</name>
        </location>
        <location>
            <code>CAXX0002</code>
            <name>Agassiz</name>
        </location>
    </country>
    <country id="Belgium">
        <location>
            <code>BEXX0001</code>
            <name>Anderlecht</name>
        </location>
    </country>
</countries>

その中のデータを使用して、次のフィールドを持つデータベース テーブル (MYSQL 5.1) を作成する必要があります。

countryName: (country タグの id 属性から読み取る)、
locationCode: (code サブタグの値から読み取る)、
locationName: (name サブタグの値から読み取る)

SQL 構文に関するヘルプをいただければ幸いです。
ありがとう!

4

3 に答える 3

0

Python SAX パーサーを使用して XML ファイルを処理します。

于 2012-08-24T09:06:50.527 に答える
0

これを行うには、PHP を使用します。それは本当に簡単です。:-)

$info = file_get_contents( "./MyFile.xml" );
$info = htmlspecialchars_decode( $info );
$xml = simplexml_load_string( $info );
$json = json_encode( $xml );
$array = json_decode( $json, true );

したがって、基本的には、最初に XML を GET し、次に特殊文字をすべて削除します (XML が &-lt-;column&-gt-; として表示される場合もあります (もちろん、ダッシュは除きます))。したがって、特殊文字のデコードを使用して、 「<column>」のようなものを残します.次に、単純な XML を使用して文字列を XML 配列に読み込みます.次に、json_encode を使用して XML を JSON に変換します.次に、json_decode を使用して JSON を変換します配列を連想配列に戻します. その形式になったら、FOREACH コマンドを使用して配列を反復処理できます. これにより、反復処理する配列が常に作成され、配列内に 2 つの要素が含まれているように見えることに気付きました: NewDataSet と Table. だから私はいつもそうします:

 foreach( $array['NewDataSet']['Table'] as $k=>$v ){
      .   .   .
 }

また、そこに空の配列がスタックしている可能性もあります。これらは、何かに価値がない場合です。SO INSERT コマンドは次のようになります。

foreach( $array["NewDataSet"]["Table"] as $k=>$v ){
    $sql = "insert into categories (";
    $val = "values (";
    foreach( $v as $k1=>$v1 ){
        $sql .= "$k1,";

        if( is_numeric($v1) ){ $val .= "$v1,"; }
            else if( is_array($v1) ){ $val .= "'',"; }
            else { $val .= "'$v1',"; }
        }

    $sql = substr( $sql, 0, -1 ) . ") " . substr( $val, 0, -1 ) . ")";
    $s = dosql( $sql );
    }

ただし、CREATE TABLE コマンドを実行するように変更することはできます。たとえば、次はすべてが XML 経由で行われる Web サイトからのものです。

<BrandUpdate>
<Input>
<param name="CustomerNumber" maxlength="5" type="xs:numeric-string">Customer Number</param>
<param name="UserName" maxlength="50" type="xs:string">User Name</param>
<param name="Password" maxlength="15" type="xs:string">Password</param>
<param name="Source" maxlength="8" type="xs:string">Description of source using service</param>
</Input>
<Output>
<DataSet>
<xs:schema id="NewDataSet">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded"><xs:element name="Table">
<xs:complexType>
<xs:sequence>
<xs:element name="BRDNO" type="xs:decimal" minOccurs="0" MaxLength="4,0" Description="Brand Id"/>
<xs:element name="BRDNM" type="xs:string" minOccurs="0" MaxLength="50" Description="Brand Name"/>
<xs:element name="BRDURL" type="xs:string" minOccurs="0" MaxLength="50" Description="Brand URL"/>
<xs:element name="ITCOUNT" type="xs:int" minOccurs="0" Description="Count of Brand Items"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element></xs:schema>
</DataSet>
</Output>
</BrandUpdate>

ご覧のとおり、CREATE TABLE コマンドを設定するためのすべての情報が既に存在します。MySQL の Web サイトにアクセスし、CREATE TABLE コマンドのレイアウト方法を取得してから、FOREACH コマンドを使用して配列を循環し、コマンドをセットアップしてテーブル エントリを作成するだけです。最後に、MySQL コマンドを実行します。

MySQLiで作業するときは、次を使用します。それはかなり単純ですが動作します

################################################################################
#   dosql(). Do the SQL command.
################################################################################
function dosql( $sql )
{
    global $mysqli;

    echo "SQL = $sql\n";
    $res = $mysqli->query( $sql );
    if( !$res ){
        $ary = debug_backtrace();
        if( isset($ary[1]) ){ $a = $ary[1]['line']; }
            else if( isset( $ary[0]) ){ $a = $ary[0]['line']; }
            else { $a = "???"; }

        echo "ERROR @ " . $a . " : (" .  $mysqli->errno . ")\n" . $mysqli->error . "\n\n";
        echo "SQL = $sql\n";
        exit;
        }

    if( preg_match("/insert/i", $sql) ){ return $mysqli->insert_id; }
    if( preg_match("/delete/i", $sql) ){ return true; }
    if( !is_object($res) ){ return null; }

    $cnt = -1;
    $ary = array();
    $res->data_seek(0);
    while( $row = $res->fetch_assoc() ){
        $cnt++;
        foreach( $row as $k=>$v ){ $ary[$cnt][$k] = $v; }
        }

    return $ary;
}

そして、次の方法で接続を開きます。

echo "Establishing a connection to the database...please wait.\n";
$mysqli = new mysqli( "<HOST>", "<USR>", "<PWD>", "<TABLE>" );
if( $mysqli->connect_errno ){
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
    exit;
    }

これが少しお役に立てば幸いです。:-)

于 2014-09-19T15:42:04.320 に答える