DomDocument kullanarak) getElementsByTagName (kullanarak elemanları bulmak değil

2 Cevap php

Ben birden ben ürün kimlikleri çekin ve e-postalar göndermek ve her ürün için başka eylemler yapmak için ayrıştırma kulüpler XML içinde bir <LineItems> içinde bulunan <LineItemInfo> ürün döngü çalışıyorum.

Sorun o şey dönen değil olmasıdır. Ben XML veri geçerli olduğunu teyit ettik ve gerekli bileşenleri içermiyor.

$itemListObject = $orderXML->getElementsByTagName('LineItemInfo');
var_dump($itemListObject->length);
var_dump($itemListObject);

var_dump in çıktısı:

int(0)
object(DOMNodeList)#22 (0) {
}

Bu, bu ile karıştırmasını benim ilk kez ve bana birkaç saat aldı ama ben onu anlamaya olamaz. Herhangi bir tavsiye harika olurdu.

EDIT:

Benim XML sadece ProductId çok daha fazla etiketleri hariç ... bu gibi görünüyor

<LineItems>
     <LineItemInfo>
         <ProductId href='[URL_TO_PRODUCT_XML]'>149593</ProductId>
     </LineItemInfo>
     <LineItemInfo>
         <ProductId href='[URL_TO_PRODUCT_XML]'>149593</ProductId>
     </LineItemInfo>
</LineItems>

Aşağıdaki kodu yürütülüyor bana productid olsun DEĞIL

$itemListObject = $orderXML->getElementsByTagName('LineItemInfo');
foreach ($itemListObject as $element) { 
        $product = $element->getElementsByTagName('ProductId');
        $productId = $product->item(0)->nodeValue;
        echo $productId.'-';
}

EDIT #2

Bir yan not olarak, çağrı

$element->item(0)->nodeValue

$ yerine ürünün $ elemanı benim, senaryonun durdurma yürütülmesine ve sunucu tarafından günlüğe herhangi bir hata atma neden oldu. O bunu işleyen ya da değil olup olmadığını öğrenmek için bir kredi kartı çalıştırmak zorunda olduğunda hata ayıklamak için bir ağrı var.

2 Cevap

Böyle print_r() ve var_dump() mutlaka normal diziler ve nesneler üzerinde olduğu gibi aynı yapmazlar gibi fonksiyonları (([{görüyorum, çünkü DOMDocument şeyler, bir kolu almak zor olabilir 2)]} kılavuzda).

Siz verileri çekmek için çeşitli fonksiyonları ve belge düğümlerin özelliklerini kullanmak zorunda. Örneğin, aşağıdaki XML olsaydı:

<LineItemInfo attr1="hi">This is a line item.</LineItemInfo>

Bundan çıkış çeşitli parçalar kullanarak olabilir:

$itemListObjects = $orderXML->getElementsByTagName('LineItemInfo');
foreach($itemListObjects as $node) {
    echo $node->nodeValue;    //echos "This is a line item."
    echo $node->attributes->getNamedItem('attr1')->nodeValue;  //echos "hi"
}

İç içe bir yapı olsaydı, childNodes özelliğini kullanarak temelde aynı prosedürü takip edebilirsiniz. Örneğin, bu olsaydı:

<LineItemInfo attr1="hi">
  <LineItem>Line 1</LineItem>
  <LineItem>Line 2</LineItem>
</LineItemInfo>

Sen böyle bir şey yapacağım:

$itemListObjects = $orderXML->getElementsByTagName('LineItemInfo');
foreach($itemListObjects as $node) {
    if ($node->hasChildNodes()) {
      foreach($node->childNodes as $c) {
         echo $c->nodeValue .",";
      }
    }
}

//you'll get output of "Line 1,Line 2,"

Umut olur.

EDIT for specific code and XML

Ben bir test script aşağıdaki kodu koştum, ve bu benim için çalışmak gibiydi. Ne çalışmıyor hakkında daha spesifik olabilir misiniz? Ben belge oluşturmak ilk iki satır hariç, tam olarak kod kullanılır. Eğer loadXML() loadHTML() üzerinde kullanıyor musunuz? Herhangi bir hata var mı?

$orderXML = new DOMDocument();
$orderXML->loadXML("
<LineItems>
     <LineItemInfo>
         <ProductId href='[URL_TO_PRODUCT_XML]'>149593</ProductId>
     </LineItemInfo>
     <LineItemInfo>
         <ProductId href='[URL_TO_PRODUCT_XML]'>149593</ProductId>
     </LineItemInfo>
</LineItems>
");

$itemListObject = $orderXML->getElementsByTagName('LineItemInfo');
foreach ($itemListObject as $element) { 
    $product = $element->getElementsByTagName('ProductId');
    $productId = $product->item(0)->nodeValue;
    echo $productId.'-';
}

//outputs "149593-149595-"

XML etiketleri yerine "LineItemInfo" ve XML harfe duyarlıdır, yani "lineItemInfo", böylece kontrol alt-deve-case (ya da sadece "deve-case") olma eğilimindedir.