SimpleXML에서 @attribute 액세스


120

@attribute내 SimpleXML 개체 의 섹션에 액세스하는 데 문제가 있습니다. 언제가 var_dump전체 개체, 나는 정확한 출력을 얻을 때, 그리고 I 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 2014

. ""수행 $ b를 문자열로 유지
dr_rk

135

이 시도

$xml->attributes()->Token

2
이것은 이미 @Artefacto의해 답변 되었습니다 .
hakre

45
네,하지만 더 단단한 형태
zysoft

2
네, 이것은 가장 우아한 솔루션입니다.
Christian

나는 이것을 시도했고 페이지가 충돌한다고 생각합니다. 아래의 Bora는 이것이 잘못된 형식이라고 생각하는 것 같습니다. 현재 동의하고 있습니다.하지만이 형식이 여러 번 언급 된 것을 보았습니다. 내가 놓친 뉘앙스가 있습니까?
Gerard ONeill

2
@GerardONeill, Bora가 속성에 액세스하는 잘못된 방법이라고 말하는 이유를 이해하지 못합니다. 꽤 완벽하게 작동합니다. 여러분이 놓칠 수있는 것은 attributes()XML의 올바른 태그에 해당하는 객체 를 호출해야한다는 것 입니다. 당신이 경우처럼 <root><tag attr="a">b</tag></root>당신은 할 필요가 $xml->tag->attributes()->attr액세스 할 수 있습니다.
zysoft

55

예전에 @attributes아래와 같이 하기 위해 여러 번 사용 했는데 조금 더 길었습니다.

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

더 쉬워야하며 한 번에 형식을 따르는 속성을 얻을 수 있습니다.

표준 방식-AAA (Array-Access Attributes)

$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 ()-> field는 단일 영숫자 단어 인 속성에 대해서만 작동합니다
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.

사실은 SimpleXMLElement get_properties핸들러가 큰 시간에 놓여 있다는 것입니다. "@attributes"라는 속성이 없으므로 할 수 없습니다 $sxml->elem->{"@attributes"}["attrib"].


SimpleXML이이 이상한 방식 ( 처리기) 으로 작동하는 이유 를 설명해 주셔서 감사합니다 get_properties. 매우 흥미로운.
andrewtweber 2014

이 대신에 가치를 수행 할 때 SimpleXMLElement 얻기
Darius.V


8

하지만 이러한 속성 목록을 찾고 있다면 XPath가 친구가 될 것입니다.

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

3

simplexml_load_file ($ file)의 결과를 JSON 구조로 변환하고 다시 디코딩하는 데 도움이되었습니다.

$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

불행히도 저는 PHP 5.5의 고유 한 빌드 (현재 Gentoo에 고정되어 있음)를 가지고 있습니다.

 $xml->tagName['attribute']

효과가 있었던 유일한 해결책이었습니다. 'Right & Quick'형식을 포함하여 위의 Bora의 모든 방법을 시도했지만 모두 실패했습니다.

이것이 가장 쉬운 형식이라는 사실은 플러스이지만 다른 사람들이 말한 모든 형식을 시도하는 것이 제 정신이 아니었다 고 생각하는 것을 좋아하지 않았습니다.

Njoy의 가치는 무엇입니까 (독특한 빌드에 대해 언급 했습니까?).


일반적으로 요소의 동일한 네임 스페이스에있는 속성에 대한 배열 표기법을 사용하는 것이 좋습니다. 나는 그것이 이유 때문에 (당신이 그것을 만드는 것처럼) 가장 쉬운 형식이라고 말하고 싶습니다. 이름이 지정된 key = attribute with simplexml 요소로 배열 액세스.
hakre
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.