PHP DOM: yerine yeni soru

4 Cevap php

Ben sadece PHP ile XML manipülasyon ile müdahalesi başladım, ve beklenmedik bir şey tökezledi. Burada bir test girişi olarak kullanıyorum XML bulunuyor:

<list>
    <activity1> running </activity1>
    <activity2> swimming </activity2>
    <activity3> soccer </activity3>
</list>

Şimdi, ben bekliyordum bu PHP kodu çıktı 'activity1' olur:

$xmldoc = new DOMDocument();
$xmldoc->load('file.xml');

//the line below would make $root the <list> node
$root = $xmldoc->firstChild;

//the line below would make $cnode the first child 
//of the <list> node, which is <activity1>
$cnode = $root->firstChild;

//this should output 'activity1'
echo 'element name: ' . $cnode->nodeName;

Bunun yerine, bu kod # metni verir. Ben düğüm adını yazdırmadan önce, kodda yeni bir satır ekleyerek düzeltmek olabilir:

$cnode = $cnode->nextSibling;

Şimdi, ben bunun yerine 'activity2' yazdırmak için umuyordum, ama 'activity1' yazdırıyor. Neler oluyor?

4 Cevap

İlk node açılış liste etiketi ve activity1 etiketi arasında (bu durumda karakterlerini) metin, bir sonraki node activity1 olan element. elemanları düğümleri olarak aynı değildir.

Eğer beklenen davranış almak için, size yük () çağrısı, ikinci parametre olarak LIBXML_NOBLANKS geçmesi gerekir

<?php
$xmldoc = new DOMDocument();
$xmldoc->load('file.xml', LIBXML_NOBLANKS);
?>

Belgenizi sorgulamak için XPath kullanıyorsanız, arkananın bu tür hakkında endişelenmenize gerek yoktur. DOMDocument::xpath_eval() deseni /list/* değerlendirmek için kullanın ve geri alırsınız tüm ne olursa olsun üst düzey list öğesinin alt öğeleridir.

Czimi cevabı üzerine bir not: boşluk sadece düğümleri çıkarırken düğüm türünü (bir eleman, bir metin düğümü, bir yorumdur olsun ...) kontrol etmesini engel olmaz. Eğer sadece eleman düğümleri seçiminde ilgileniyorsanız eğer genel olarak, böyle bir şey yapmak istersiniz:

while($nodeInQuestion->nodeType != 1 && $nodeInQuestion->nextSibling) {
    $nodeInQuestion = $nodeInQuestion->nextSibling;
}

Bu pseudo-kod tür. Bunu bulmak önce Açıkçası size bir eleman arıyorsanız bir şekilde başarısızlık işlemek gerekiyor ve ParentNode en ChildNodes sonuna ulaşmak olacak.