SimpleXML'den @ attribute'e erişim


120

@attributeSimpleXML nesnemin bölümüne erişirken sorun yaşıyorum . Ne zaman var_dumptüm nesneyi, ben doğru çıktı almak ve ne zaman var_dumpnesne (iç içe etiketleri), ben doğru çıktı almak, ancak dokümanlar izleyin ve ne zaman geri kalanı var_dump $xml->OFFICE->{'@attributes'}aslında buna rağmen, boş bir nesneyi almak ilki var_dump, çıktıya yönelik niteliklerin olduğunu açıkça gösterir.

Burada neyi yanlış yaptığımı bilen / bunu nasıl çalıştırabilirim?


5
var_dump (), SimpleXML söz konusu olduğunda yanıltıcıdır. Çıktısını tam anlamıyla almayın. Ayrıca, dizi erişimini kullanarak özniteliklere erişemiyor musunuz? örneğin $ xml-> OFİS ['Özniteliklerim']?
Frank Farmer

['@ öznitelikler'] kullanmak istiyorsanız, SimpleXMLElement'ı ilk diziye aktarmanız gerekir
Enrique

Yanıtlar:


88

Bir XML düğümünde attributes () işlevini çağırarak bir XML öğesinin niteliklerini elde edebilirsiniz. Daha sonra işlevin dönüş değerini var_dump edebilirsiniz.

Php.net http://php.net/simplexmlelement.attributes adresinde daha fazla bilgi

O sayfadan örnek kod:

$xml = simplexml_load_string($string);
foreach($xml->foo[0]->attributes() as $a => $b) {
    echo $a,'="',$b,"\"\n";
}

7
İlginç bir şekilde, $bbir SimpleXMLElementnesne olacak print_rve var_dumpsize tuhaf şeyler verecek. Bunu aşmak için onu bir dizge (veya ne istersen) olarak çevirebilirsin.
jxmallett

Bir dizge olarak tutmak için "". $ B yapın
dr_rk

135

Bunu dene

$xml->attributes()->Token


45
Evet, ama daha zor bir biçimde
zysoft

2
Evet, bu en zarif çözüm.
Christian

Bunu denedim ve sanırım sayfa çöküyor. Aşağıdaki Bora bunun yanlış bir format olduğunu düşünüyor ve şu anda aynı fikirdeyim .. Ancak bu formatın (sizin) birçok kez anıldığını gördüm. Kaçırdığım bir nüans var mı?
Gerard ONeill

2
@GerardONeill, Bora'nın neden özelliklere erişmenin yanlış bir yol olduğunu söylediğini anlamıyorum, oldukça mükemmel çalışıyor. Eksik olabileceğiniz şey, XML'nizdeki attributes()doğru etikete karşılık gelen nesneyi çağırmanız gerektiğidir . Sanki sahipseniz, erişmek <root><tag attr="a">b</tag></root>için yapmanız $xml->tag->attributes()->attrgerekir.
zysoft

55

@attributesAşağıya inmek için daha önce birçok kez kullandım ve biraz daha uzundu.

$att = $xml->attributes();
echo $att['field'];

Daha kolay olmalı ve biçimi aşağıdaki nitelikleri yalnızca bir defada alabilirsiniz:

Standart Yol - Dizi Erişim Öznitelikleri (AAA)

$xml['field'];

Diğer alternatifler:

Sağ ve Hızlı Biçimlendirme

$xml->attributes()->{'field'};

Yanlış Biçimler

$xml->attributes()->field;
$xml->{"@attributes"}->field;
$xml->attributes('field');
$xml->attributes()['field'];
$xml->attributes->['field'];

1
İlk yanlış formatlarınıza katılıyorum çünkü bir sayfa çökmesi alıyorum - ancak birçok kişi bunun işe yaradığını iddia ediyor. Bununla ilgili herhangi bir açıklama veya nüans var mı?
Gerard ONeill

1
"Yanlış formatlar" çalışıyor. Ben her zaman ilk örneği kullanırım. Neden yanlış?
Grzegorz

3
Teknik olarak, $xml->attributes()->{'field'}, $xml->attributes()->field, ve $f='field'; $xml->attributes()->$f;aynıdır. Neden birinin doğru, diğerinin yanlış olması için hiçbir neden görmeyin.
zysoft

$ xml-> öznitelikler () -> {'alan'} doğru çünkü öznitelik adında özel karakterlerle (yani, "data-öznitelik") kullanmak güvenlidir. $ xml-> attributes () -> alanı yalnızca tek alfanümerik kelimeler olan nitelikler için çalışır
vzr

Her iki doğru seçeneği kullanırken SimpleXMLElement alma.
Darius.V

41
$xml = <<<XML
<root>
<elem attrib="value" />
</root>
XML;

$sxml = simplexml_load_string($xml);
$attrs = $sxml->elem->attributes();
echo $attrs["attrib"]; //or just $sxml->elem["attrib"]

Kullanın SimpleXMLElement::attributes.

Gerçek şu ki, SimpleXMLElement get_propertiesişleyicisi büyük zaman yatıyor. "@ Attributes" adında bir özellik yok, bu yüzden yapamazsınız $sxml->elem->{"@attributes"}["attrib"].


SimpleXML'in neden bu kadar tuhaf davrandığını ( get_propertiesişleyici) açıkladığınız için teşekkür ederiz . Çok ilginç.
andrewtweber

Değer yerine bunu yaparken SimpleXMLElement'i elde etmek
Darius.V


8

Yine de bu özelliklerin bir listesini arıyorsanız, XPath arkadaşınız olacaktır.

print_r($xml->xpath('@token'));

3

Simplexml_load_file ($ dosya) sonucunu bir JSON Yapısına dönüştürmeme ve geri çözmeme yardımcı oldu:

$xml = simplexml_load_file("$token.xml");
$json = json_encode($xml);
$xml_fixed = json_decode($json);

$try1 = $xml->structure->{"@attributes"}['value'];
print_r($try1);

>> result: SimpleXMLElement Object
(
)

$try2 = $xml_fixed->structure->{"@attributes"}['value'];
print_r($try2);

>> result: stdClass Object
(
    [key] => value
)

2

Maalesef PHP 5.5'in benzersiz bir yapısına (şimdilik Gentoo ile bağlı) sahibim ve bulduğum şey şuydu:

 $xml->tagName['attribute']

işe yarayan tek çözümdü. 'Doğru ve Hızlı' formatı da dahil olmak üzere yukarıdaki tüm Bora yöntemlerini denedim ve hepsi başarısız oldu.

Bunun en kolay format olması bir artı, ancak diğerlerinin işe yaradığını söylediği tüm formatları denerken delirdiğimi düşünmekten hoşlanmadım.

Njoy değeri ne için (benzersiz yapıdan bahsetmiş miydim?).


Normalde, parçası oldukları öğenin aynı isim alanındaki özniteliklerin öznitelikleri için dizi gösterimini kullanmanızı öneririm. Bunun bir nedenden ötürü en kolay format olduğunu söyleyebilirim (para kazandıkça). simplexml elemanlı key = özniteliğiyle dizi erişimi.
hakre
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.