Как добавить данные из XML-ленты в базу данных mysql - PullRequest
1 голос
/ 04 января 2012

Я получаю поток предложений и хочу обработать его, чтобы добавить его в свою БД. Вот формат, в котором это входит:

<deals>
 <item>
  <couponid>int</couponid>
  <merchantid>int</merchantid>
  <merchantname>string</merchantname>
  <network>string</network>
  <label>string</label>
  <restrictions>string</restrictions>
  <couponcode>string</couponcode>
  <link>string</link>
  <directlink>string</directlink>
  <startdate>YYYY-MM-DD HH:MM TMZ</startdate>
  <enddate>YYYY-MM-DD HH:MM TMZ</enddate>
  <image>string</image>
  <dealtypes>
   <type>string</type>
  </dealtypes>
  <categories>
   <category>string</category>
  </categories>
  <status>status</status>
  <lastupdated>YYYY-MM-DD HH:MM TMZ</lastupdated>
  <errorreporturl>string</errorreporturl>
  <changeaudit>string</changeaudit>
  <price>string</price>
  <listprice>string</listprice>
  <discount>string</discount>
  <percent>string</percent>
  <local>
     <city>string</city>
     <state>string</state>
     <zipcode>string</zipcode>
     <address>string</address>
     <businessname>string</businessname>
     <businessurl>string</businessurl>
     <title2>string</title2>
     <expirationdate>string</expirationdate>
     <minpurchase>int</minpurchase>
     <maxpurchase>int</maxpurchase>
     <limitedqty>bool</limitedqty>
     <region>string</region>
  </local>
 </item>
</deals>

Я могу обработать большинство предметов, используя:

'couponid' => $node->getElementsByTagName('couponid')->item(0)->nodeValue

Однако, как мне обработать элементы в «локальном» узле. Не все элементы в ленте имеют этот «локальный» узел. Как бы я это обработал? Будет ли это работать:

$localData = $node->getElementsByTagName('local')->item(0);
if $localData {
'city' => $node->getElementsByTagName('local')->item(city)->nodeValue;
'state' => $node->getElementsByTagName('local')->item(state)->nodeValue;
etc..
}

Ответы [ 2 ]

1 голос
/ 04 января 2012

Согласно DOMNodeList документы , DOMNodeList::item вернется

Узел в индексной позиции в DOMNodeList или NULL, если это недопустимый индекс.

Итак, нет, вы не можете сделать $node->getElementsByTagName('local')->item(city).

Когда вы делаете это $localData = $node->getElementsByTagName('local')->item(0);, ваша $localData переменная устанавливается на объект DOMNode, к дочерним элементам которого вы можете обращаться, как и к любому другому DOMNode дочернему объекту.

Однако

Если вы просто читаете XML, а не пишете / добавляете, PHP SimpleXML намного проще в использовании (отсюда и название), чем DOM, и я бы порекомендовал его в вашем случае:

$deals = new SimpleXMLElement($my_xml);

$city  = $deals->item->local->city[0];
$state = (string) $deals->item->local->state;

echo "city:  $city\n";
echo "state: $state\n";

Обратите внимание, что метод, использующий приведение (string), дает тот же результат, что и простая ссылка на клавишу [0] элемента.

0 голосов
/ 04 января 2012

В php вы можете сделать следующее:

-> Получить XML-файл:

$myXMLString = file_get_contents($url);
$doc = new DOMDocument('1.0', 'iso-8859-1');
$doc->loadXML($myXMLString);
$deals = $doc->getElementsByTagName("item");

foreach($deals as $item){
   functionDeals($item);
}

Затем в функции "functionDeals" извлеките подэлемент таким же образом. В противном случае самый простой способ - использовать Hibernate (Java): перейдите по этой ссылке http://javaboutique.internet.com/tutorials/mapping/

Надеюсь, эта помощь

...