2013-04-12 3 views
0

Порция XML-файл, который представляет проблему (файл XML имеет сотни записей клиентов)
вставки XML-данных в MySQL с PHP

<?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. Как получить доступ для получения customer.buyerinfo.shippinga Значение узла ddress.name с использованием mysql_real_escape_string в моей инструкции insert? обозначенную «???»

    Тот факт, что у меня есть два узла с тем же именем узла «имя», один является customer.name и другое customer.buyerinfo.shippingaddress. имя, чтобы назвать это проблематичным , чтобы использовать getElementsByTagName «Имя», чтобы получить значение.

  2. так же, как и первый, но как я могу получить saletaxamount значение данных узла?

    Просьба помочь. Спасибо!

+1

1. Существует нет '??? 'в вашем коде. Любой, почему вы делаете такое нечестивое сочетание кода? Извлеките значения из XML ** THEN ** создайте свой запрос. смешивание его вместе, что делает совершенно неразборчивым бесполезным беспорядком. –

+0

@ Marc B. Спасибо за ваш добрый отзыв. Я хотел сказать "???" в моей инструкции insert. Узнайте что-нибудь от вас «Совершенно нечитаемый бесполезный беспорядок». Вау! Спасибо вам за это. –

ответ

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) 
    } 
} 

, конечно, вы сможете исправить запрос с новыми значениями.

это должно ваша работа, извините я не шанс проверить это

+0

Благодарим вас за отзыв. Не могли бы вы подробнее остановиться на исправлении запроса с новыми значениями? пример кода будет высоко оценен. Еще раз спасибо за ваше время, энергию и усилия, чтобы помочь решить эту проблему. –

1

Для данных XML вы имеете я предпочел бы расширение SimpleXML, он поставляется со всем необходимым, и это не так уж много кода, чтобы написать (это маленькая сестра DOMDocument).

Итак, для каждого пользователя во входных данных вы хотите получить 9 или около того значений. Вы можете сформулировать эти значения как xpath:

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

Это работает аналогично запросу базы данных. Вы создаете строку, содержащую запрос, для XML на языке Xpath.

И мы делаем то же самое для 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 (или создать один больший запрос, содержащий более одной записи):

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, вы можете значительно упростить это.

Для первого клиента в вашем образце-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) 
     ); 
    } 
} 
+0

@ M8R-1jmw5r Благодарим вас за отзыв.Более всего это примерная часть проекта, над которым я работал. Похоже, что xpath - хорошая идея для сглаживания сложного дерева XML. Я дам ему шанс и посмотрю, что произойдет. Еще раз спасибо за ваше время и руководство. –

+0

Да, я бы предпочел Xpath, если вам нужно пройтись по разной глубине (а также, если она отличается между значениями-элементами и значениями атрибутов). –

+0

+1 для отличного примера кода – michi