Düz XML XML çıkış dizisi

2 Cevap

Ben CURL kullanarak 4 URL (XML) toplayan ve 4 öğelerin her URL sonuçlarını ocntaining ile bir dizi döndüren bir komut dosyası var.

İşte dizidir:

array(3) {
  [0]=>
  string(41772) "<?xml version="1.0" encoding="UTF-8"?>
<statuses type="array">
<status>
  <created_at>Tue Mar 30 20:58:53 +0000 2010</created_at>
  <id>11328253513</id>
  <text>...</text>
  <source...</source>
  <truncated>false</truncated>
  <in_reply_to_status_id></in_reply_to_status_id>
  <in_reply_to_user_id></in_reply_to_user_id>
  <favorited>true</favorited>
  <in_reply_to_screen_name></in_reply_to_screen_name>
  <user>
    <id>1...</id>
    <name>....</name>
</status>
</statuses>
"
  [1]=>
  string(20630) "<?xml version="1.0" encoding="UTF-8"?>
<statuses type="array">
<status>
  <created_at>Sun Feb 28 14:12:30 +0000 2010</created_at>
  <id>...</id>
  <text>...</text>
  <source>&lt;a

etc...

Nasıl kolayca çıktı alabilirsiniz diziden XML? Ben de <statuses> başlar ve her dizi arasında biter birine 3 XML yapıları birleştirmek gerekiyor.

2 Cevap

Bu gibi basit bir birleşme için ayrıca sadece yapabilirsiniz:

$xml = implode('', $theArray); 
$xml = str_replace(array('<?xml version="1.0" encoding="UTF-8"?>',
                         '<statuses type="array">',
                         '</statuses>'), '', $xml); 

$xml = '<?xml version="1.0" encoding="UTF-8"?>'
     . '<statuses type="array">'
     . $xml
     . '</statuses>';

Not: denenmemiş, ama temelde öyle her birine tüm XML belgeleri tutkal, daha sonra bu yüzden sadece statü düğümleri kalır, XML Prologs ve tüm kök düğümlerini kaldırmak. Bunlar daha sonra geçerli bir XML iskelet, örneğin içine kaydırılmıştır Tekrar Prolog ve kök düğüm. Bitti.

DOM düğümler ne biliyor beri string fonksiyonları onlar hakkında hiçbir ipucu varken DOM, daha güvenilir olacağını kullanırken, daha sonra DOM Düğümler ile çalışmak istiyorum. Eğer, DOM ile çalışmak Pascal'ın örnekte de görüldüğü gibi, loading the documents with load yerine CURL düşünün karar verirseniz - ya da daha sonra yukarıdaki ilk kullanın ve load that document from the string with loadXml().

Eğer olsa kullanmaya karar ne olursa olsun, Regex kullanmayın. Bu çılgınlığa yol.

: Olası bir fikir olacaktır

  • Create a new $destination instance of DOMDocument
    • Bir <statuses> düğüm ile başlatılamıyor
  • For each of your 3 XML strings :
    • başka bir örneğine yük DOMDocument: $currentDocument
    • $currentDocument->getElementsByTagName ile <status> düğümü veya bir eşdeğer bulmak
    • $destination->importNode ile sadece $destination belgeye buldum <status> düğümü, ithalat
  • Her XML dize üzerinde döngü tamamlandığında, $destination belge istediğini içermelidir, ve sen kullanarak kaydedebilirsiniz $destination->saveXML


And here's a quick example of code that could help you understand what I meant :

Öncelikle, burada XML dizeler dizisi - Ben onları çok daha kısa yaptık, ama fikir ne var ki aynı:

$strings = array(
  '<?xml version="1.0" encoding="UTF-8"?>
    <statuses type="array"><status>
      <id>ID 1</id>
    </status></statuses>',
  '<?xml version="1.0" encoding="UTF-8"?>
    <statuses type="array"><status>
      <id>ID 2</id>
    </status></statuses>',
  '<?xml version="1.0" encoding="UTF-8"?>
    <statuses type="array"><status>
      <id>ID 3</id>
    </status></statuses>',
);


Let's create the destination document, and put a <statuses> tag in it :

$destination = new DOMDocument();
$destination->formatOutput = true;
$destinationStatuses = $destination->createElement('statuses');
$destination->appendChild($destinationStatuses);


Now, we loop over the 3 XML strings :

foreach ($strings as $str) {
  $current = new DOMDocument();
  $current->loadXML($str);
  $currentStatuses = $current->getElementsByTagName('status');
  foreach ($currentStatuses as $currentStatus) {
    $destinationStatus = $destination->importNode($currentStatus, true);
    $destinationStatuses->appendChild($destinationStatus);
  }
}


For each string, we :

  • Yeni bir DOMDocument bunu yükleyin
  • Bul <status> tag (s)
  • Her <status> etiketi, hedef belgede içe
  • Ve <statuses> etiketi eklemek


And, finally, if we output the content of the new document :

echo '<pre>' . htmlspecialchars($destination->saveXML()) . '</pre>';


We get :

<?xml version="1.0"?>
<statuses>
  <status>
      <id>ID 1</id>
    </status>
  <status>
      <id>ID 2</id>
    </status>
  <status>
      <id>ID 3</id>
    </status>
</statuses>

yani bizim üç <status> Üç özgün dizeleri tek bir XML belgesi haline birleştirilmiştir ;-)