Truy cập @attribute từ SimpleXML


120

Tôi đang gặp sự cố khi truy cập @attributephần của đối tượng SimpleXML của mình. Khi tôi var_dumptoàn bộ đối tượng, tôi nhận được kết quả chính xác và khi tôi nhận được đầu ra chính xác var_dumpcủa đối tượng (các thẻ lồng nhau), tôi nhận được kết quả chính xác, nhưng khi tôi làm theo các tài liệu và var_dump $xml->OFFICE->{'@attributes'}, tôi nhận được một đối tượng trống, mặc dù thực tế là đầu tiên var_dumpcho thấy rõ ràng rằng có các thuộc tính để xuất.

Bất cứ ai biết tôi đang làm gì sai ở đây / làm cách nào tôi có thể làm cho việc này hoạt động?


5
var_dump () gây hiểu lầm khi nói đến SimpleXML. Đừng coi đầu ra của nó theo nghĩa đen. Ngoài ra, bạn không thể truy cập các thuộc tính bằng cách sử dụng quyền truy cập mảng? ví dụ: $ xml-> OFFICE ['MyAttribute']?
Frank Farmer

nếu bạn muốn sử dụng [ '@attributes'] bạn cần phải cast SimpleXMLElement đến mảng đầu tiên
Enrique

Câu trả lời:


88

Bạn có thể lấy các thuộc tính của một phần tử XML bằng cách gọi hàm thuộc tính () trên một nút XML. Sau đó, bạn có thể var_dump giá trị trả về của hàm.

Thông tin thêm tại php.net http://php.net/simplexmlelement.attributes

Mã mẫu từ trang đó:

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

7
Thật thú vị, $bsẽ là một SimpleXMLElementđối tượng như vậy print_rvar_dumpsẽ cho bạn những điều kỳ lạ. Bạn có thể ép nó thành một chuỗi (hoặc bất cứ thứ gì bạn thích) để giải quyết vấn đề này.
jxmallett

Thực hiện "". $ B để giữ nó dưới dạng chuỗi
dr_rk

135

Thử cái này

$xml->attributes()->Token

2
Điều này đã được trả lời bởi @Artefacto .
hakre

45
Có, nhưng trong một hình thức khó khăn hơn
zysoft

2
Đúng, đây là giải pháp thanh lịch nhất.
Christian

Tôi đã thử điều này và tôi nghĩ rằng trang đang bị lỗi. Bora dưới đây dường như nghĩ rằng đây là một định dạng sai, mà tôi đồng ý vào lúc này .. Tuy nhiên, tôi đã thấy định dạng này (của bạn) được đề cập nhiều lần. Có một số sắc thái tôi đang thiếu?
Gerard ONeill

2
@GerardONeill, tôi không hiểu tại sao Bora nói rằng đó là cách truy cập sai vào các thuộc tính, nó hoạt động khá hoàn hảo. Điều bạn có thể thiếu là bạn cần gọi attributes()đối tượng tương ứng với thẻ phù hợp trong XML của bạn. Giống như nếu bạn có <root><tag attr="a">b</tag></root>thì bạn cần phải làm gì $xml->tag->attributes()->attrđể truy cập nó.
zysoft

55

Tôi đã sử dụng trước đây rất nhiều lần để đạt được @attributesnhư bên dưới và nó lâu hơn một chút.

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

Nó sẽ dễ dàng hơn và bạn có thể nhận được các thuộc tính sau định dạng chỉ cùng một lúc:

Cách chuẩn - Thuộc tính truy cập mảng (AAA)

$xml['field'];

Các lựa chọn thay thế khác là:

Định dạng phải & nhanh

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

Định dạng sai

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

1
Tôi đồng ý với định dạng sai đầu tiên của bạn vì tôi đang gặp sự cố trang - tuy nhiên, nhiều người đang khẳng định điều này hoạt động. Bất kỳ lời giải thích hoặc sắc thái về điều này?
Gerard ONeill

1
"Định dạng sai" hoạt động. Tôi luôn sử dụng ví dụ đầu tiên. Tại sao nó sai?
Grzegorz

3
Về mặt kỹ thuật, $xml->attributes()->{'field'}, $xml->attributes()->field, và $f='field'; $xml->attributes()->$f;đều giống nhau. Không hiểu lý do tại sao một định dạng đúng và một định dạng khác là sai.
zysoft

$ xml-> properties () -> {'field'} đúng vì nó an toàn khi sử dụng với các ký tự đặc biệt trong tên thuộc tính (tức là "data-attr"). $ XML-> thuộc tính () -> Lĩnh vực chỉ hoạt động cho các thuộc tính là những từ chữ và số đơn
vzr

Nhận SimpleXMLElement khi sử dụng cả hai tùy chọn chính xác.
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"]

Sử dụng SimpleXMLElement::attributes.

Sự thật là, get_propertiestrình xử lý SimpleXMLElement nói dối rất nhiều. Không có thuộc tính nào có tên "@attributes", vì vậy bạn không thể thực hiện $sxml->elem->{"@attributes"}["attrib"].


Cảm ơn bạn đã giải thích tại sao SimpleXML hoạt động theo cách kỳ lạ này ( get_propertiestrình xử lý). Rất thú vị.
andrewtweber

Nhận được SimpleXMLElement khi làm điều này thay vì giá trị
Darius.V


8

Nếu bạn đang tìm kiếm danh sách các thuộc tính này, XPath sẽ là bạn của bạn

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

3

Nó đã giúp tôi chuyển đổi kết quả của simplexml_load_file ($ file) thành Cấu trúc JSON và giải mã nó trở lại:

$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

Thật không may, tôi có một bản dựng duy nhất (bị mắc kẹt với Gentoo tại thời điểm này) của PHP 5.5 và những gì tôi tìm thấy là

 $xml->tagName['attribute']

là giải pháp duy nhất có hiệu quả. Tôi đã thử tất cả các phương pháp của Bora ở trên, bao gồm cả định dạng 'Đúng & Nhanh' và tất cả đều không thành công.

Thực tế là đây là định dạng dễ nhất là một điểm cộng, nhưng tôi không thích khi nghĩ rằng tôi đã điên khi thử tất cả các định dạng mà người khác nói là hiệu quả.

Thật vui vì giá trị của nó (tôi đã đề cập đến bản dựng độc đáo chưa?).


Tôi thường khuyên bạn nên sử dụng ký hiệu mảng cho các thuộc tính cho các thuộc tính trong cùng một không gian tên của phần tử mà chúng nằm trong đó. Tôi muốn nói rằng đó là định dạng dễ dàng nhất (khi bạn đặt nó) là có lý do. truy cập mảng với thuộc tính key = được đặt tên với phần tử simplexml.
hakre
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.