컨텍스트에 관계없이 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.SimpleXMLObject를 문자열로 타입 변환 :
SimpleXMLObject를 문자열로 타입 변환 :
$foo = array( (string) $xml->channel->item->title );
위의 코드는 내부적으로 SimpleXMLObject에서 __toString ()을 호출합니다. 이 메소드는 SimpleXMLObject의 매핑 체계를 방해하므로 공개적으로 사용할 수 없지만 위의 방식으로 호출 할 수 있습니다.
-
==============================
2.PHP 함수를 사용할 수 있습니다.
PHP 함수를 사용할 수 있습니다.
strval();
이 함수는 전달 된 매개 변수의 문자열 값을 반환합니다.
-
==============================
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.그것을하는 또 다른 추악한 방법 :
그것을하는 또 다른 추악한 방법 :
$foo = array( $xml->channel->item->title."" );
그것은 작동하지만 예쁜 것은 아닙니다.
-
==============================
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.허용 된 대답은 실제로 OP가 요청한 문자열 (문자열)을 포함하지 않는 문자열을 포함하는 배열을 반환합니다. 해당 답변을 확장하려면 다음을 사용하십시오.
허용 된 대답은 실제로 OP가 요청한 문자열 (문자열)을 포함하지 않는 문자열을 포함하는 배열을 반환합니다. 해당 답변을 확장하려면 다음을 사용하십시오.
$foo = [ (string) $xml->channel->item->title ][0];
배열의 단일 요소 인 문자열을 반환합니다.
-
==============================
7.시도해보십시오 strval ($ xml-> channel-> item-> title)
시도해보십시오 strval ($ xml-> channel-> item-> title)
-
==============================
8.수락 된 답변이 작성 되었기 때문에 __toString () 메서드의 가시성을 변경했는지는 확실하지 않지만 현재로서는 제대로 작동합니다.
수락 된 답변이 작성 되었기 때문에 __toString () 메서드의 가시성을 변경했는지는 확실하지 않지만 현재로서는 제대로 작동합니다.
var_dump($xml->channel->item->title->__toString());
산출:
string(15) "This is title 1"
-
==============================
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
from https://stackoverflow.com/questions/416548/forcing-a-simplexml-object-to-a-string-regardless-of-context by cc-by-sa and MIT license
'PHP' 카테고리의 다른 글
PHP에서 업로드 된 파일 형식을 확인하는 방법 (0) | 2018.09.17 |
---|---|
Javascript 배열 전달 -> PHP (0) | 2018.09.17 |
PHP 경고 : 호출 시간 기준 전달은 더 이상 사용되지 않습니다. (0) | 2018.09.17 |
$ _POST를 사용하여 HTML에서 선택 옵션 값 얻기 (0) | 2018.09.17 |
strpos에서 바늘로 배열 사용하기 (0) | 2018.09.17 |