Q&A

SimpleXMLElement Object 에서 특정 값만 추출하기

2023.01.14 05:40
1,589
0
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

  • 2023.01.14 06:38 #1738235
    1. $val['d'] 해보셨나요?
    2. 올려주신 소스만 보면 SimpleXMLElement를 선언한 것이 아니라 그냥 SimpleXMLElement 어쩌고 하는 내용이 들어 있는 문자열을 선언하신 것 같은데요.
  • 2023.01.14 06:56 #1738239

    안녕하세요 기진곰님 답변 감사합니다.

     

    답변주신것을 해도 공백으로 아무것도 표시가 되지 않습니다.

    print_r($val); 값을 출력한것이

    SimpleXMLElement Object ( [a] => a1 [b] => b1 [c] => c1 [d] => d1 ) 이런식으로 나와서 결과를 찾고 있습니다.
    그러면 문자열을 다시 SimpleXMLElement로 바꾸거나 json으로 바꾸는 방법이 있을까요?

  • 2023.01.14 07:25 #1738253

    원본 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가 되는군요.

  • 2023.01.16 00:25 #1738563

    친절한 답변 감사합니다.

    확실히 이렇게 정상적인 SimpleXMLElement Object 일때는 $val->d가 작동하는것 같습니다.

    아무래도 지금 제상태는 일반 txt로 구성되어있는 것 같아 strpos 를 활용하여 추출해 보아야겠네요.

    감사합니다.

  • 2023.01.16 01:21 #1738605

    네, 가져올 수 있는 데이터가 텍스트라면 그 텍스트를 대상으로 필요한 정보를 통해 키와 변수값을 파싱해서 따로 변수를 만들어주는 게 나을 듯합니다.

     

    <?php
    $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'];

     

  • 2023.01.16 01:49 #1738617

    https://3v4l.org/bqk1C
    잘 작동하는것 같습니다.
    감사합니다.

    제 실서버에서는 Array ( [] => ) 로 작동을 안하는거 보니 뭔가 상황이 또 다른가보네요 ㅠㅠ

  • 2023.01.16 01:51 #1738623
    마지막에 $final_array['promotion_link']; 라고 하신 걸 보니
    예시하신 것과는 다르게 실제에서는 텍스트를 다른 형태로 전달받고 계신 게 아닌가 싶습니다.
    정규식을 사용하는 방법이다보니 띄어쓰기나 기호 하나하나가 민감할 거예요.
  • 2023.01.16 01:55 #1738627
    d로 사용했습니다.
    심지어 지금 실젤 출력되는 print_r 결과값을 $val = 에 넣으면 잘뜨네요. 여튼 윤삼님이 적어주신 코드는 정상작동함이 확실합니다 ㅎㅎ
  • 2023.01.16 02:03 #1738638

    아... echo 말고
    print_r 로하니깐 val->d 가 작동되네요.


    윤삼님 귀한 시간 내어 주셔서 감사합니다.

    적어주신 코드도 꼭 가지고있다가 잘 사용하겠습니다.

  • 2023.01.16 02:04 #1738642
    echo 말고
    print_r 로하니깐 val->d 가 작동되네요.
    어이가 없기도 하고 신기하기도 하네요.
    시간 내어 주셔서 감사합니다.
  • 2023.01.14 14:08 #1738283
    (array)$val
  • 2023.01.16 00:44 #1738579
    라엘님 답변 감사합니다.
    (array)$val로 해도 반응이 없습니다.
  • 2023.01.16 01:15 #1738595
    그러면 json_decode(json_encode($val), true) 해보세요.