0

問題を表す xml ファイルの一部 (xml ファイルには何百もの顧客レコードが含まれています)

    <?xml version="1.0" encoding="utf-8"?>
    <test>
       <customer>   
          <name>customer 1</name>
          <address>address 1</address>
          <city>city 1</city>
          <state>state 1</state>
          <zip>zip 1</zip>
          <phone>phone 1</phone>
          <buyerinfo>
             <shippingaddress>
               <name>ship to</name>
               <address>Ship address1</address>
             </shippingaddress>
           </buyerinfo>
           <shippingDetail>
             <saletax>
               <saletaxamount>2</saletaxamount>
             </saletax>
           </shippingDetail>
       </customer>...

以下は私のコードです

 //Xml string is parsed and creates a DOM Document object
    $responseDoc = new DomDocument();        
    $responseDoc->load('test.xml');     
    foreach ($responseDoc->getElementsByTagName('customer') as $customer){

     $sSQL = sprintf(
    "INSERT INTO customer (name, address, city, state, zip, phone, shipto, shipadderss, tax) 
    VALUES ('%s','%s', '%s', '%s','%s','%s', '%s','%s','%s')",
    mysql_real_escape_string($customer->getElementsByTagName('name')->item(0)->nodeValue),
    mysql_real_escape_string($customer->getElementsByTagName('address')->item(0)->nodeValue),
    mysql_real_escape_string($customer->getElementsByTagName('city')->item(0)->nodeValue),
    mysql_real_escape_string($customer->getElementsByTagName('state')->item(0)->nodeValue),
    mysql_real_escape_string($customer->getElementsByTagName('zip')->item(0)->nodeValue),
    mysql_real_escape_string($customer->getElementsByTagName('phone')->item(0)->nodeValue)
    ?
    ?
    ?       
);
$rResult = mysql_query($sSQL);

if(mysql_errno() > 0)
{
    printf(
        '<h4 style="color: red;">Query Error:</h4>
        <p>(%s) - %s</p>
        <p>Query: %s</p>
        <hr />',
        mysql_errno(),
        mysql_error(),
        $sSQL
    );
}

    }

質問:

  1. insert ステートメントで mysql_real_escape_string を使用して、customer.buyerinfo.shippingaddress.name ノード値を取得するためのアクセスを取得するにはどうすればよいですか? 「 ???」で示される

    同じノード名"name"を持つ 2 つのノードがあり、1 つはcustomer.nameで、もう 1 つはcustomer.buyerinfo.shippingaddress.nameであるという事実により、 getElementsByTagName "name" タグを使用して値を取得することが問題になります。

  2. 最初のものと同じですが、saletaxamount ノードのデータ値を取得するにはどうすればよいですか?

    親切に助けてください。ありがとうございました!

4

2 に答える 2

1

あなたが持っている XML データについては、SimpleXML エクステンションを好みます。それには必要なものがすべて同梱されており、記述するコードはそれほど多くありません (これは DOMDocument の妹です)。

したがって、入力データの顧客ごと に、9 つほどの値をフェッチする必要があります。これらの値を xpath として定式化できます。

$values = <<<XPATH
(
    name
    |address
    |city
    |state
    |zip
    |phone
    |buyerinfo/shippingaddress/name
    |buyerinfo/shippingaddress/address
    |shippingDetail/saletax/saletaxamount
)
XPATH;

これは、データベース クエリと同様に機能します。Xpath 言語で XML のクエリを含む文字列を作成します。

そして、両方が連携する必要があるため、SQL についても同じことを行います。したがって、これに応じた SQL パターンを次に示します。

$pattern = <<<SQL
INSERT INTO customer
  (
    name, address, city, state, zip, phone, shipto, shipadderss, tax
  )
  VALUES
  (
    '%s','%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s'
  )
SQL;

これで必要なのは、XML を開いて、作業する顧客要素を指定することだけです。

$customers = simplexml_load_string($test)->customer; // "test.xml"

次に、各顧客に対して foreach を実行し、値を取得してエスケープし、それらをクエリに挿入して SQL クエリを実行するだけです (または、複数のレコードを含む 1 つの大きなクエリを作成します)。

foreach ($customers as $customer) 
{
    $data = $customer->xpath($values);
    $escaped = array_map('mysql_real_escape_string', $data);
    $query = vsprintf($pattern, $escaped);

    // you can now run the query now
    // ...
}

はい、それはすでにあなたのコードです。ご覧のとおり、配列、xpath、および SQL を使用すると、これを大幅に簡素化できます。

sample-XMLの最初の顧客に対して、次のクエリが生成されます。

INSERT INTO customer
  (
    name, address, city, state, zip, phone, shipto, shipadderss, tax
  )
  VALUES
  (
    'customer 1','address 1', 'city 1', 'state 1', 'zip 1', 'phone 1', 'ship to', 'Ship address1', '2'
  )

コード例全体:

$values = <<<XPATH
(
    name
    |address
    |city
    |state
    |zip
    |phone
    |buyerinfo/shippingaddress/name
    |buyerinfo/shippingaddress/address
    |shippingDetail/saletax/saletaxamount
)
XPATH;

$pattern = <<<SQL
INSERT INTO customer
  (
    name, address, city, state, zip, phone, shipto, shipadderss, tax
  )
  VALUES
  (
    '%s','%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s'
  )
SQL;

$customers = simplexml_load_string($test)->customer; // "test.xml"

foreach ($customers as $customer)
{
    $data = $customer->xpath($values);
    $escaped = array_map('mysql_real_escape_string', $data);
    $query = vsprintf($pattern, $escaped);

    // you can now run the query now
    $result = mysql_query($query);
    if(mysql_errno())
    {
        printf(
            '<h4 style="color: red;">Query Error:</h4>
            <p>(%s) - %s</p>
            <p>Query:
              <pre>%s</pre>
            </p>
            <hr />',
            mysql_errno(),
            htmlspecialchars(mysql_error()),
            htmlspecialchars($query)
        );
    }
}
于 2013-04-12T19:25:21.830 に答える
0

ノード内のループで子ノードの値を取得できshippingaddressます。

のようなもの、その後 mysql_real_escape_string($customer->getElementsByTagName('phone')->item(0)->nodeValue)

追加:

foreach ($customer->getElementsByTagName('buyerinfo') as $buyerinfo)
{
    foreach ($buyerinfo->getElementsByTagName('shippingaddress') as $shippingaddress)
    {
        mysql_real_escape_string($shippingaddress->getElementsByTagName('name')->item(0)->nodeValue),
        mysql_real_escape_string($shippingaddress->getElementsByTagName('address')->item(0)->nodeValue)
    }
}

もちろん、クエリを新しい値で修正する必要があります。

これはあなたの仕事です。申し訳ありませんが、テストする機会がありません

于 2013-04-12T17:27:56.773 に答える