PHP 페이지에서 PHP 친화적인 구문으로 XML을 쿼리, 검색, 수정 및 다시 게시할 수 있게 해주는 PHP 버전 5와 함께 번들로 제공되는 SimpleXML 확장에 대해 알아보세요.
PHP 버전 5에는 XML 읽기 및 쓰기를 위한 새로운 API(응용 프로그래밍 인터페이스)인 SimpleXML이 도입되었습니다. SimpleXML에서 다음 표현식:
$doc->rss->channel->item->title
문서에서 요소를 선택합니다. 이 표현은 문서의 구조만 잘 알면 쉽게 작성할 수 있습니다. 그러나 필수 요소가 나타나는 위치(예: Docbooks, HTML 및 유사한 서술형 문서)가 확실하지 않은 경우 SimpleXML은 XPath 표현식을 사용하여 이러한 요소를 찾을 수 있습니다.
SimpleXML 시작하기
RSS 피드를 HTML로 변환하려면 PHP 페이지가 필요하다고 가정해 보겠습니다. RSS는 연결된 콘텐츠를 게시하기 위한 간단한 XML 형식입니다. 문서의 루트 요소는 채널 요소를 포함하는 rss입니다. 채널 요소에는 제목, 언어, URL 등 피드에 대한 메타데이터가 포함되어 있습니다. 또한 항목 요소에 캡슐화된 다양한 보고서가 포함되어 있습니다. 각 항목에는 URL이 포함된 링크 요소와 일반 텍스트가 포함된 제목 또는 설명(일반적으로 둘 다)이 있습니다. 네임스페이스는 사용되지 않습니다. 확실히 RSS에는 그보다 더 많은 내용이 있지만 이 기사에서는 이것으로 충분합니다. 목록 1은 두 개의 뉴스 항목이 포함된 일반적인 예를 보여줍니다.
목록 1. RSS 피드
<?xml version="1.0" 인코딩="UTF-8"?>
<rss 버전="0.92">
<채널>
<title>모카 미트 슐라그</title>
<link>http://www.elharo.com/blog</link>
<언어>ko</언어>
<아이템>
<title>펜 스테이션: 사라졌지만 잊혀지지는 않았습니다</title>
<설명>
뉴욕의 오래된 펜 스테이션은 제가 태어나기도 전에 철거되었습니다.
이 사진들을 보면 현재 사이트가 틀린 것 같습니다.
기능적이지만 더 이상은 사무실 타워와 지하에 불과합니다.
특별히 흥미롭지도 아름답지도 않은 복도.. 새로운 매디슨 스퀘어..
</설명>
<link>http://www.elharo.com/blog/new-york/2006/07/31/penn-station</link>
</item>
<아이템>
<title>엘리엇 해롤드의 개인정보</title>
<description>어떤 사람들은 귀하를 요구하는 매우 불쾌한 스팸 필터를 사용합니다.
E37T와 같이 제목에 임의의 문자열을 입력하여 통과합니다.
말할 필요도 없이 나나 대부분의 다른 사람들은 굳이 의사소통을 하지 않는다.
이러한 편집증 환자들은 스팸 문제에 대해 극도로 과잉 반응하고 있습니다.
개인적으로는...</description>
<link>http://www.elharo.com/blog/tech/2006/07/28/personal-for-elliotte-harold/</link>
</item>
</채널>
</rss>
RSS 피드를 HTML로 형식화하는 PHP 페이지를 개발해 보겠습니다. 목록 2는 이 페이지의 기본 구조를 보여줍니다.
목록 2. PHP 코드의 정적 구조
<?php // XML 문서 로드 및 구문 분석 ?>
<html xml:lang="ko" lang="ko">
<머리>
<title><?php // RSS에서 제목을 읽습니다. ?></title>
</head>
<body>
<h1><?php // RSS에서 제목을 다시 읽습니다. ?></h1>
<?php
// 여기에 각 항목의 제목과 설명을 포함하는 루프를 넣습니다.
?>
</body>
</html>
XML 문서 구문 분석
첫 번째 단계는 XML 문서를 구문 분석하고 이를 변수에 저장하는 것입니다. 필요한 것은 URL을 simplexml_load_file() 함수에 전달하는 코드 한 줄뿐입니다:
$rss = simplexml_load_file('http://partners.userland.com/nytRss/nytHomepage.xml');
이 예에서는 Userland의 New York Times 피드( http://partners.userland.com/nytRss/nytHomepage.xml )에서 페이지를 채웠습니다. 물론 다른 RSS 피드에 대한 URL도 사용할 수 있습니다.
이름은 simplexml_load_file()이지만 이 함수는 실제로 원격 HTTP URL에서 XML 문서를 구문 분석합니다. 하지만 이 기능의 이상한 점은 그것만이 아닙니다. DOM(문서 개체 모델)과 같은 다른 API를 사용한 경우 예상할 수 있듯이 반환 값(여기서 $rss 변수에 저장됨)은 전체 문서를 가리키지 않습니다. 대신 문서의 루트 요소를 가리킵니다. 문서 프롤로그 및 에필로그의 내용은 SimpleXML에서 액세스할 수 없습니다.
피드 제목 찾기
전체 피드의 제목(피드의 개별 스토리 제목이 아님)은 RSS 루트 요소 채널의 하위 제목에 있습니다. 마치 XML 문서가 rss 클래스 객체의 직렬화된 형식이고 해당 채널 필드 자체에 제목 필드가 있는 것처럼 제목을 쉽게 찾을 수 있습니다. 일반 PHP 개체 참조 구문을 사용하여 제목을 찾는 명령문은 다음과 같습니다.
$title = $rss->channel->title;
일단 발견되면 출력 HTML에 추가할 수 있습니다. $title 변수를 echo하면 됩니다:
<title><?php echo $title ?></title>
이 줄은 전체 요소가 아닌 요소의 문자열 값을 출력합니다. 즉, 텍스트 내용은 작성되지만 태그는 포함되지 않습니다.
중간 변수 $title을 완전히 건너뛸 수도 있습니다:
<title><?php echo $rss->channel->title ?></title>
페이지에서는 이 값을 여러 위치에서 재사용하기 때문에 명확한 의미를 지닌 변수에 저장하는 것이 더 편리하다고 생각합니다.
…