오늘 php에서 xml 형식을 출력하는데, 거의 2~3시간 고생했군요-_-;;
평소에는 잘 되던 거였는데,, 왜 안되는가 이유를 모르겠더군요..

2시간쯤 뻘짓해보고나서야 
<?xml version="1.0" encoding="UTF-8"?> 선언하기 전에 위쪽에 공백이 있으면 안된다는걸 알았고,

그래서 그 공백이 왜 생기나 의아해했습니다.

처음에는 네이버 블로그 api를 쓰는 작업이었는데,, api 자체에서 값을 넘겨줄 때 잘 못 넘겨주나 싶었는데,,
아무리 검색을 해봐도 그런 글은 찾아볼 수가 없더군요-_-;;

그래서 혹시 echo함수의 문제인가,,해서 또 찾아봤더니,, echo함수에도 그런 문제는 없더군요..

결국 원점으로 돌아가서 그냥 아무 글이나 echo로 출력해봤습니다.
그랬는데,, 이상하게 위에 두줄이 띄워지더군요;;;
그래서 php문서를 잘 살펴보니,,, 최초 <?php를 시작하기 전에 제가 엔터를 두번쳤더군요-_-;;
그래서 안되는 거였음..;;;

xml... 생각보다 까다롭군요.


한가지 참고할 것!
php에서 xml형식으로 만들어서 echo로 출력하면 보이기에는 xml 형식인 것 같지만, 뭔가 하나 빠진 것 같습니다.
아직 정확히는 모르겠는데, 자바스크립트에서 해당 페이지를 읽어서 바로 dom객체로 인식이 안되더군요-_-
그런데, php 문서에서 xml을 출력하기 전에 
header("Content-type: text/xml");
를 호출해주면 자바스크립트에서 이 문서를 dom객체로 바로 인식하네요.

뭔가 확실하게는 모르겠지만, xml을 출력할 때에는 header()함수를 호출해주는 것이 좋을 듯 합니다.
저작자 표시
신고
Posted by Code-Moon

댓글을 달아 주세요

HTTPService를 이용하면 XML, JSON등의 형식으로 데이터를 송신 및 수신할 수 있다.
그런데 이번에 다음 책 검색API를 이용하여 웹 사이트를 만들려고 했었는데, 이 때 큰 문제가 있었다.

보통 액션스크립트를 이용해서 받아온 xml데이터를 조작해 줄 필요가 있을 것이다.
그러면 for문이나 for each문을 이용해서 하나하나의 값을 조작해줘야 하는데, xml에 들어있는 값이 여러개일 때에는 문제가 되지 않는데 1개의 값만 갖고 있을 때 문제가 발생한다.

받아온 xml의 형식은 아래 그림과 같다고 하고 예를 살펴보자.

root는 channel이고 그 밑에 Item의 총 개수를 나타내는 totalCount가 있고, Item이 0개 이상 존재하게 된다. 각 아이템마다 title과 imageSrc를 가지게 된다.

이런 형식의 데이터를 받아온다고 했을 때, 보통은 다음과 같은 방식으로 HTTPService의 resultHandler를 코딩하게 될 것이다.
private function resultHandler(event : ResultEvent) : void {
	if(event.result.channel.totalCount == 0) {
		Alert.show("표시할 아이템이 없습니다.");
		return;
	}

	for each(var item : Object in event.result.channel.item) {
		//item.title 처리
		//item.imageSrc 처리
	}
}

이런식으로 코딩을 하게 되면 평소에는 잘 동작하는 듯 보인다. 그런데 그 결과를 잘 살펴보면 잘 못 동작하고 있다는 것을 알 수 있다.
바로 Item이 1개일 경우이다. Item이 1개일 경우에는 for each문을 수행하지 않는다. 그래서 아무런 결과 값도 처리할 수 없게 된다. 이러한 문제는 만들려는 프로그램의 종류에 따라서는 심각한 문제가 될 수 있다.

그래서 열심히 구글링한 결과 다음과 같이 코딩하면 된다는 것을 알았다.
private function resultHandler(event : ResultEvent) : void {
	if(event.result.channel.totalCount == 0) {
		Alert.show("표시할 아이템이 없습니다.");
		return;
	}
	
	var results : ArrayCollection;
	
	if(event.result.channel.item == null) {
		Alert.show("데이터가 없습니다.");
		return;
	} else if(event.result.channel.item is ObjectProxy) {
		results = new ArrayCollection([event.result.channel.item]);
	} else {
		results = event.result.channel.item as ArrayCollection;
	}
	
	for each(var item : Object in result) {
		//item.title 처리
		//item.imageSrc 처리
	}
}

신고
Posted by Code-Moon

댓글을 달아 주세요

  1. BlogIcon pooha302 2010.03.11 17:02 신고 Address Modify/Delete Reply

    XML의 데이터 구조에 따라 for each로 사용 가능한지 판단해서 적절히 사용할 수 있도록 해야지.
    나는 짜증나면 for문으로 전부 일일이 파싱해서 처리하는데 ㅋㅋ
    근데 뭐하는데 액션스크립트를 사용하노??

    • BlogIcon Code-Moon 2010.03.16 11:09 신고 Address Modify/Delete

      원래 for each는 1개일때 안되요??

    • BlogIcon Code-Moon 2010.03.16 11:10 신고 Address Modify/Delete

      아, 그리고 중학교 때 플래시를 썼었는데,ㅎ 그동안 버려두고 있었거든요,ㅎ 그래서 제가 알고있는 as가 2.0 수준이었는데,ㅎ
      이번에 플렉스도 해볼겸 해서 as3.0으로 매쉬업 해볼려고했죠.ㅎ

티스토리 툴바