การเข้าถึง @attribute จาก SimpleXML


120

ฉันมีปัญหาในการเข้าถึง@attributeส่วนของวัตถุ SimpleXML ของฉัน เมื่อฉันvar_dumpสร้างวัตถุทั้งหมดฉันจะได้ผลลัพธ์ที่ถูกต้องและเมื่อฉันvar_dumpเหลือวัตถุ (แท็กที่ซ้อนกัน) ฉันจะได้ผลลัพธ์ที่ถูกต้อง แต่เมื่อฉันทำตามเอกสารและvar_dump $xml->OFFICE->{'@attributes'}ฉันได้รับวัตถุว่างเปล่าแม้ว่าจะมีความจริงที่ว่าvar_dumpอย่างแรกแสดงให้เห็นอย่างชัดเจนว่ามีคุณลักษณะที่จะส่งออก

ใครรู้ว่าฉันทำอะไรผิดที่นี่ / ฉันจะทำงานนี้ได้อย่างไร?


5
var_dump () ทำให้เข้าใจผิดเมื่อพูดถึง SimpleXML อย่าเอาผลลัพธ์ตามตัวอักษร นอกจากนี้คุณไม่สามารถเข้าถึงแอตทริบิวต์โดยใช้การเข้าถึงอาร์เรย์ได้หรือไม่? เช่น $ xml-> OFFICE ['MyAttribute']?
Frank Farmer

หากคุณต้องการใช้ ['@attributes'] คุณต้องแคสต์ SimpleXMLElement ไปยังอาร์เรย์ก่อน
Enrique

คำตอบ:


88

คุณสามารถรับแอตทริบิวต์ขององค์ประกอบ XML ได้โดยการเรียกใช้ฟังก์ชัน attributes () บนโหนด XML จากนั้นคุณสามารถ var_dump ค่าส่งคืนของฟังก์ชัน

ข้อมูลเพิ่มเติมที่ php.net http://php.net/simplexmlelement.attributes

ตัวอย่างโค้ดจากหน้านั้น:

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

7
ที่น่าสนใจ$bจะเป็นSimpleXMLElementวัตถุprint_rและvar_dumpจะให้สิ่งแปลก ๆ แก่คุณ คุณสามารถโยนมันเป็นสตริง (หรืออะไรก็ได้ที่คุณต้องการ) เพื่อหลีกเลี่ยงสิ่งนี้
jxmallett

ทำ "". $ b เพื่อเก็บไว้เป็นสตริง
dr_rk

135

ลองทำตามนี้

$xml->attributes()->Token

2
นี้ได้รับการตอบรับแล้วโดย @Artefacto
hakre

45
ใช่ แต่ในรูปแบบที่ยากกว่า
zysoft

2
ใช่นี่เป็นทางออกที่สง่างามที่สุด
คริสเตียน

ฉันได้ลองสิ่งนี้แล้วและฉันคิดว่าหน้าพัง ดูเหมือนว่าโบราด้านล่างจะคิดว่านี่เป็นรูปแบบที่ไม่ถูกต้องซึ่งฉันก็เห็นด้วยในตอนนี้ .. อย่างไรก็ตามฉันเคยเห็นรูปแบบ (ของคุณ) ที่กล่าวถึงหลายครั้ง มีความแตกต่างเล็กน้อยที่ฉันขาดหายไปหรือไม่?
Gerard ONeill

2
@GerardONeill ฉันไม่เข้าใจว่าทำไมโบราถึงบอกว่าเข้าถึงแอตทริบิวต์ผิดวิธีมันทำงานได้ค่อนข้างสมบูรณ์แบบ สิ่งที่คุณอาจขาดหายไปคือคุณต้องเรียกattributes()วัตถุที่สอดคล้องกับแท็กที่ถูกต้องใน XML ของคุณ เช่นถ้าคุณมี<root><tag attr="a">b</tag></root>แล้วคุณต้องทำ$xml->tag->attributes()->attrเพื่อเข้าถึง
zysoft

55

ฉันเคยใช้มาก่อนหลายครั้งเพื่อรับ@attributesไลค์ด้านล่างและนานกว่านี้เล็กน้อย

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

ควรจะง่ายกว่าและคุณสามารถรับแอตทริบิวต์ต่อไปนี้ได้ในครั้งเดียวเท่านั้น:

วิธีมาตรฐาน - คุณสมบัติการเข้าถึงอาร์เรย์ (AAA)

$xml['field'];

ทางเลือกอื่น ได้แก่ :

รูปแบบที่ถูกต้องและรวดเร็ว

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

รูปแบบไม่ถูกต้อง

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

1
ฉันเห็นด้วยกับรูปแบบแรกของคุณที่ไม่ถูกต้องเนื่องจากฉันประสบปัญหาหน้าพัง - อย่างไรก็ตามมีหลายคนอ้างว่าได้ผล คำอธิบายหรือความแตกต่างเล็กน้อยเกี่ยวกับเรื่องนี้หรือไม่?
Gerard ONeill

1
งาน "ผิดรูปแบบ" ฉันมักจะใช้ตัวอย่างแรก ทำไมถึงทำผิด?
Grzegorz

3
เทคนิค$xml->attributes()->{'field'}, $xml->attributes()->fieldและ$f='field'; $xml->attributes()->$f;จะเหมือนกัน ไม่เห็นเหตุผลว่าทำไมรูปแบบหนึ่งถึงถูกและอีกรูปแบบหนึ่งผิด
zysoft

$ xml-> attributes () -> {'field'} ถูกต้องเพราะปลอดภัยที่จะใช้กับอักขระพิเศษในชื่อแอตทริบิวต์ (เช่น "data-attr") ฟิลด์ $ xml-> attributes () -> ใช้ได้เฉพาะกับแอตทริบิวต์ที่เป็นคำที่เป็นตัวเลขและตัวอักษรตัวเดียว
vzr

รับ SimpleXMLElement เมื่อใช้ทั้งสองตัวเลือกที่ถูกต้อง
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"]

ใช้SimpleXMLElement::attributes.

ความจริงก็คือget_propertiesตัวจัดการSimpleXMLElement ครั้งใหญ่ มีคุณสมบัติไม่มีชื่อ "@attributes" $sxml->elem->{"@attributes"}["attrib"]เพื่อให้คุณไม่สามารถทำ


ขอขอบคุณที่อธิบายว่าเหตุใด SimpleXML จึงทำงานในลักษณะที่แปลกประหลาดนี้ ( get_propertiesตัวจัดการ) น่าสนใจมาก.
andrewtweber

รับ SimpleXMLElement เมื่อทำสิ่งนี้แทนค่า
Darius.V


8

หากคุณกำลังมองหารายการคุณลักษณะเหล่านี้ XPath จะเป็นเพื่อนของคุณ

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

3

มันช่วยฉันในการแปลงผลลัพธ์ของ simplexml_load_file ($ file) เป็น JSON Structure และถอดรหัสกลับ:

$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

น่าเสียดายที่ฉันมีงานสร้างที่ไม่เหมือนใคร (ติดอยู่กับ Gentoo ในขณะนี้) ของ PHP 5.5 และสิ่งที่ฉันพบก็คือ

 $xml->tagName['attribute']

เป็นทางออกเดียวที่ใช้ได้ผล ฉันลองใช้วิธีการทั้งหมดของ Bora ข้างต้นรวมถึงรูปแบบ 'Right & Quick' แต่ก็ล้มเหลวทั้งหมด

ความจริงที่ว่านี่เป็นรูปแบบที่ง่ายที่สุดคือข้อดี แต่ก็ไม่ได้คิดว่าฉันบ้าไปแล้วกับการลองใช้รูปแบบทั้งหมดที่คนอื่นบอกว่าได้ผล

สนุกกับสิ่งที่คุ้มค่า (ฉันพูดถึงงานสร้างที่เป็นเอกลักษณ์หรือไม่?)


โดยปกติฉันจะแนะนำให้ใช้สัญกรณ์อาร์เรย์สำหรับแอตทริบิวต์สำหรับแอตทริบิวต์ในเนมสเปซเดียวกันขององค์ประกอบที่เป็นส่วนหนึ่งของ ฉันว่ามันเป็นรูปแบบที่ง่ายที่สุด (ในขณะที่คุณหยอดเหรียญ) ด้วยเหตุผล การเข้าถึงอาร์เรย์ด้วยชื่อคีย์ = แอตทริบิวต์ที่มีองค์ประกอบ simplexml
hakre
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.