SimpleXMLElement Object 에서 특정 값만 추출하기
CMS/프레임워크 | 사용안함 |
---|---|
개발 언어 | PHP 8.2 |
안녕하세요.
xml을 가져온건 아닌데
아래와 같이 내용이 선언된것이 있습니다. 여기서
d의값 d1만 가지고오려면 어떻게하는것이 좋을까요?
<?php
$val = "SimpleXMLElement Object ( [a] => a1 [b] => b1 [c] => c1 [d] => d1 )";
echo($val);
http://jun.hansung.ac.kr/SWP/PHP/PHP%20XML%20SimpleXML.html 를 참고해서
echo $val->d 로 해보아도 결과가 나오지 않습니다.
혹시 관련하여 도움 주실 수 있으면 도움 부탁드립니다.
https://3v4l.org/MXI1r/rfc
감사합니다.

톰캣
Lv. 11
시대의 흐름에 뒤떨어지지 않도록 아주 천천히지만 노력하고 있습니다.
댓글 13
2. 올려주신 소스만 보면 SimpleXMLElement를 선언한 것이 아니라 그냥 SimpleXMLElement 어쩌고 하는 내용이 들어 있는 문자열을 선언하신 것 같은데요.
안녕하세요 기진곰님 답변 감사합니다.
답변주신것을 해도 공백으로 아무것도 표시가 되지 않습니다.
print_r($val); 값을 출력한것이
SimpleXMLElement Object ( [a] => a1 [b] => b1 [c] => c1 [d] => d1 ) 이런식으로 나와서 결과를 찾고 있습니다.
그러면 문자열을 다시 SimpleXMLElement로 바꾸거나 json으로 바꾸는 방법이 있을까요?
원본 XML이 어떤 형태로 되어 있었는지에 따라 SimpleXML 구조가 미묘하게 바뀔 수 있기 때문에 정확하게 알기는 어렵습니다만, 대개 $val->d 아니면 $val['d'] 둘 중 하나는 통하는 게 정상입니다.
위에서 나온 자료구조에 가장 근접한 예제를 임의로 만들어 본다면
$xml = '<foo><a>a1</a><b>b1</b><c>c1</c><d>d1</d></foo>';
$val = simplexml_load_string($xml);
print_r($val);
SimpleXMLElement Object ( [a] => a1 [b] => b1 [c] => c1 [d] => d1 )
echo $val->d;
d1
여기서는 $val->d가 되는군요.
친절한 답변 감사합니다.
확실히 이렇게 정상적인 SimpleXMLElement Object 일때는 $val->d가 작동하는것 같습니다.
아무래도 지금 제상태는 일반 txt로 구성되어있는 것 같아 strpos 를 활용하여 추출해 보아야겠네요.
감사합니다.
네, 가져올 수 있는 데이터가 텍스트라면 그 텍스트를 대상으로 필요한 정보를 통해 키와 변수값을 파싱해서 따로 변수를 만들어주는 게 나을 듯합니다.
$val = "SimpleXMLElement Object ( [a] => a1 [b] => b1 [c] => c1 [d] => d1 )";
$val = preg_replace('/(^\w[^\(]+\(\s+?)([^\)]+)(\s+?\)$)/', '$2', $val); // 괄호 안의 텍스트만 추출
$val = preg_replace('/\s+?\[/', ',[', $val); // 배열 내의 원소가 될 수 있는 부분 사이 쉼표를 삽입
$tmp_arr = array_map('trim', explode(',', $val)); // 추출된 텍스트를 가지고 원소별로 구분하는 배열(1) 생성
$final_array = []; // 최종 변수를 배열로 설정
foreach($tmp_arr as $v)
{
$line = array_map('trim', explode('=>', $v)); // 배열(1)을 '=>' 기준으로 키와 변수값으로 분할
$key = preg_replace('/[\[\]\s]/', '', $line[0]); // 키값에 있는 대괄호 및 공백을 제거
$value = trim($line[1]); // 변수값의 텍스트를 트리밍
$final_array[$key] = $value; // 최종 변수에 키와 변수값을 할당
}
print_r($final_array);
echo $final_array['d'];
https://3v4l.org/bqk1C
잘 작동하는것 같습니다.
감사합니다.
제 실서버에서는 Array ( [] => ) 로 작동을 안하는거 보니 뭔가 상황이 또 다른가보네요 ㅠㅠ
예시하신 것과는 다르게 실제에서는 텍스트를 다른 형태로 전달받고 계신 게 아닌가 싶습니다.
정규식을 사용하는 방법이다보니 띄어쓰기나 기호 하나하나가 민감할 거예요.
심지어 지금 실젤 출력되는 print_r 결과값을 $val = 에 넣으면 잘뜨네요. 여튼 윤삼님이 적어주신 코드는 정상작동함이 확실합니다 ㅎㅎ
아... echo 말고
print_r 로하니깐 val->d 가 작동되네요.
윤삼님 귀한 시간 내어 주셔서 감사합니다.
적어주신 코드도 꼭 가지고있다가 잘 사용하겠습니다.
print_r 로하니깐 val->d 가 작동되네요.
어이가 없기도 하고 신기하기도 하네요.
시간 내어 주셔서 감사합니다.
(array)$val로 해도 반응이 없습니다.