복붙노트

컨텍스트에 관계없이 SimpleXML 객체를 문자열로 강제 변환

PHP

컨텍스트에 관계없이 SimpleXML 객체를 문자열로 강제 변환

내가 이런 XML을 가지고 있다고 가정 해 봅시다.

<channel>
  <item>
    <title>This is title 1</title>
  </item>
</channel>

아래 코드는 제목을 문자열로 출력한다는 점에서 내가 원하는 것을 수행합니다.

$xml = simplexml_load_string($xmlstring);
echo $xml->channel->item->title;

여기 내 문제가있다. 아래 코드는 그 문맥에서 제목을 문자열로 취급하지 않으므로 문자열 대신 배열에 SimpleXML 객체로 끝납니다.

$foo = array( $xml->channel->item->title );

나는 이것 같이 그것을 주변에 일하고있다

$foo = array( sprintf("%s",$xml->channel->item->title) );

그러나 그것은 추한 것처럼 보인다.

컨텍스트에 관계없이 SimpleXML 객체를 문자열에 적용하는 가장 좋은 방법은 무엇입니까?

해결법

  1. ==============================

    1.SimpleXMLObject를 문자열로 타입 변환 :

    SimpleXMLObject를 문자열로 타입 변환 :

    $foo = array( (string) $xml->channel->item->title );
    

    위의 코드는 내부적으로 SimpleXMLObject에서 __toString ()을 호출합니다. 이 메소드는 SimpleXMLObject의 매핑 체계를 방해하므로 공개적으로 사용할 수 없지만 위의 방식으로 호출 할 수 있습니다.

  2. ==============================

    2.PHP 함수를 사용할 수 있습니다.

    PHP 함수를 사용할 수 있습니다.

    strval();
    

    이 함수는 전달 된 매개 변수의 문자열 값을 반환합니다.

  3. ==============================

    3.SimpleXMLElement :: asXML 네이티브 SimpleXML 메서드가 있습니다. 매개 변수에 따라 SimpleXMLElement를 xml 1.0 파일에 쓰거나 문자열에만 씁니다.

    SimpleXMLElement :: asXML 네이티브 SimpleXML 메서드가 있습니다. 매개 변수에 따라 SimpleXMLElement를 xml 1.0 파일에 쓰거나 문자열에만 씁니다.

    $xml = new SimpleXMLElement($string);
    $validfilename = '/temp/mylist.xml';
    $xml->asXML($validfilename);    // to a file
    echo $xml->asXML();             // to a string
    
  4. ==============================

    4.그것을하는 또 다른 추악한 방법 :

    그것을하는 또 다른 추악한 방법 :

    $foo = array( $xml->channel->item->title."" );
    

    그것은 작동하지만 예쁜 것은 아닙니다.

  5. ==============================

    5.XML 데이터를 PHP 배열로 가져 오려면 다음을 수행하십시오.

    XML 데이터를 PHP 배열로 가져 오려면 다음을 수행하십시오.

    // this gets all the outer levels into an associative php array
    $header = array();
    foreach($xml->children() as $child)
    {
      $header[$child->getName()] = sprintf("%s", $child); 
    }
    echo "<pre>\n";
    print_r($header);
    echo "</pre>";
    

    차일드 아이를 얻으려면 다음과 같이하십시오.

    $data = array();
    foreach($xml->data->children() as $child)
    {
      $header[$child->getName()] = sprintf("%s", $child); 
    }
    echo "<pre>\n";
    print_r($data);
    echo "</pre>";
    

    원하는 수준까지 $ xml-> 각 수준을 확장 할 수 있습니다. 당신은 또한 모든 노드를 레벨없이 하나의 배열에 넣을 수 있습니다. 네가 원하는 다른 방법에 대해서.

  6. ==============================

    6.허용 된 대답은 실제로 OP가 요청한 문자열 (문자열)을 포함하지 않는 문자열을 포함하는 배열을 반환합니다. 해당 답변을 확장하려면 다음을 사용하십시오.

    허용 된 대답은 실제로 OP가 요청한 문자열 (문자열)을 포함하지 않는 문자열을 포함하는 배열을 반환합니다. 해당 답변을 확장하려면 다음을 사용하십시오.

    $foo = [ (string) $xml->channel->item->title ][0];
    

    배열의 단일 요소 인 문자열을 반환합니다.

  7. ==============================

    7.시도해보십시오 strval ($ xml-> channel-> item-> title)

    시도해보십시오 strval ($ xml-> channel-> item-> title)

  8. ==============================

    8.수락 된 답변이 작성 되었기 때문에 __toString () 메서드의 가시성을 변경했는지는 확실하지 않지만 현재로서는 제대로 작동합니다.

    수락 된 답변이 작성 되었기 때문에 __toString () 메서드의 가시성을 변경했는지는 확실하지 않지만 현재로서는 제대로 작동합니다.

    var_dump($xml->channel->item->title->__toString());
    

    산출:

    string(15) "This is title 1"
    
  9. ==============================

    9.다음은 모든 단일 자식 요소를 String으로 유형 변환하는 재귀 함수입니다.

    다음은 모든 단일 자식 요소를 String으로 유형 변환하는 재귀 함수입니다.

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // FUNCTION - CLEAN SIMPLE XML OBJECT
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    function cleanSimpleXML($xmlObject = ''){
    
        // LOOP CHILDREN
        foreach ($xmlObject->children() as $child) {
    
            // IF CONTAINS MULTIPLE CHILDREN
            if(count($child->children()) > 1 ){
    
                // RECURSE
                $child = cleanSimpleXML($child);
    
            }else{
    
                // CAST
                $child = (string)$child;
    
            }
    
        }
    
        // RETURN CLEAN OBJECT
        return $xmlObject;
    
    } // END FUNCTION
    
  10. from https://stackoverflow.com/questions/416548/forcing-a-simplexml-object-to-a-string-regardless-of-context by cc-by-sa and MIT license