PHP를 사용하여 XML 파일을 동적으로 생성하는 방법은 무엇입니까?


233

런타임에 XML 파일을 동적으로 생성해야합니다. PHP를 사용하여 아래 XML 파일을 동적으로 생성하는 데 도움을주십시오.

<?xml version="1.0" encoding="UTF-8"?>
<xml>
 <track>
     <path>song1.mp3</path>
     <title>Track 1 - Track Title</title>
 </track>
 <track>
     <path>song2.mp3</path>
     <title>Track 2 - Track Title</title>
 </track>
 <track>
     <path>song3.mp3</path>
     <title>Track 3 - Track Title</title>
 </track>
 <track>
     <path>song4.mp3</path>
     <title>Track 4 - Track Title</title>
 </track>
 <track>
     <path>song5.mp3</path>
     <title>Track 5 - Track Title</title>
 </track>
 <track>
     <path>song6.mp3</path>
     <title>Track 6 - Track Title</title>
 </track>
 <track>
     <path>song7.mp3</path>
     <title>Track 7 - Track Title</title>
 </track>
 <track>
     <path>song8.mp3</path>
     <title>Track 8 - Track Title</title>
 </track>


1
또한 xml 1.0은 모든 검색 엔진에서 지원되지 않습니다. 가장 알려진 xml 버전이므로 xml 0.9를 사용하는 것이 좋습니다!
Domuta Marcel

PHP와 MySQL을 사용하여 XML 파일 생성 -kvcodes.com/2017/03/generate-xml-file-using-php-mysql
Kvvaradha

1
@Kvvaradha 그건 좋은 해결책이 아닙니다
robertmain

답변:


358

SimpleXMLElement를 사용 합니다.

<?php

$xml = new SimpleXMLElement('<xml/>');

for ($i = 1; $i <= 8; ++$i) {
    $track = $xml->addChild('track');
    $track->addChild('path', "song$i.mp3");
    $track->addChild('title', "Track $i - Track Title");
}

Header('Content-type: text/xml');
print($xml->asXML());

12
SimpleXml로 인코딩을 지정할 수 있습니까? 어떻게 할 수 있습니까?
Eineki 2018 년

1
안녕하세요, 귀하의 예를 시도했지만 유효성 검사에서 2 개의 경고가 표시됩니다. validator.w3.org/…
Satya

3
@Eineki는 <?xml version="1.0" encoding="WHATEVER_IT_IS"?>처리 명령을 추가합니다 . 나는 SimpleXMLElement가 올바른 일을 할 것이라고 믿습니다. 쿼리 된 모든 문자열 값을 mb_internal_encoding으로 변환합니다.
Ivan Krechetov

33
$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\" ?><Person></Person>");
kebyang

'6 열의 2 행에 오류가 발생합니다. 문서 시작시에만 XML 선언이 허용됩니다. 이 코드는 XML 시작 부분에 빈 줄을 추가하여 구문 분석 오류를 발생시킵니다.
Elia Weiss

179

PHP에서 XML 문서를 생성하려면 DOMDocument 클래스를 인스턴스화하고 자식 노드를 생성 한 후이 노드를 문서 트리의 올바른 분기에 추가해야합니다.

참고로 http://it.php.net/manual/en/book.dom.php 를 읽을 수 있습니다

이제 아래 코드를 간단히 살펴 보겠습니다.

  • 2 행에서 빈 xml 문서를 만듭니다 (xml 버전 (1.0) 및 인코딩 (utf8) 만 지정)
  • 이제 xml 트리를 채워야합니다.
    • xmlnode를 만들어야합니다 (5 행)
    • 올바른 위치에 추가해야합니다. 우리는 루트를 만들고 있으므로 이것을 domdocument에 직접 추가합니다.
    • create element는 요소를 노드에 추가하고 삽입 된 노드를 반환합니다. 트랙 노드를 루트 노드에 추가하기 위해이 참조를 저장합니다 (XML이라고도 함).

이것들은 기본이며, 한 줄로 노드를 만들고 추가 할 수 있습니다 (예 : 13 번째) .dom api로 다른 많은 일을 할 수 있습니다. 너하기에 달렸다.

<?php    
    /* create a dom document with encoding utf8 */
    $domtree = new DOMDocument('1.0', 'UTF-8');

    /* create the root element of the xml tree */
    $xmlRoot = $domtree->createElement("xml");
    /* append it to the document created */
    $xmlRoot = $domtree->appendChild($xmlRoot);

    $currentTrack = $domtree->createElement("track");
    $currentTrack = $xmlRoot->appendChild($currentTrack);

    /* you should enclose the following two lines in a cicle */
    $currentTrack->appendChild($domtree->createElement('path','song1.mp3'));
    $currentTrack->appendChild($domtree->createElement('title','title of song1.mp3'));

    $currentTrack->appendChild($domtree->createElement('path','song2.mp3'));
    $currentTrack->appendChild($domtree->createElement('title','title of song2.mp3'));

    /* get the xml printed */
    echo $domtree->saveXML();
?>

편집 : 다른 힌트 하나 : XML을 인쇄하는 대신 xmldocument (dom 문서 하나 또는 simplexml 하나)를 사용하는 주요 이점은 xmltree를 xpath 쿼리로 검색 할 수 있다는 것입니다


6
다시 사용할 수 $domtree->save('mypath/xmlfile.xml');있습니까?
guitarlass

1
@guitarlass 당신이 맞아요. savesaveXML 은 비슷합니다. 첫 번째는 xmltree를 파일로 덤프하고 두 번째는 문자열로 덤프합니다 (그리고 일반적인 파일 저장 지시문을 사용하여 다음 단계에서 저장할 수 있습니다).
Eineki

4
@jjonesdesign 게으른 데 필요한 지식을 얻기 위해 열심히
노력해야합니다.

1
예제는 XML 요소로 구분되는 하나의 긴 행을 생성합니다. 당신 $domtree->formatOutput = true;은 출력을 예쁘게 만들기 위해 추가해야합니다 :)
JackTheKnife

1
@Drenyl은 적절한 컨텐츠 유형 헤더를 추가하고 a Content-Disposition: attachmentsaveXml 결과를 인쇄합니다. 파일 이름을 제안 할 수도 있습니다.
Eineki

27

이를 수행하는 가장 쉬운 방법은 다음과 같습니다.

<?php
// Send the headers
header('Content-type: text/xml');
header('Pragma: public');
header('Cache-control: private');
header('Expires: -1');
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>";

echo '<xml>';

// echo some dynamically generated content here
/*
<track>
    <path>song_path</path>
    <title>track_number - track_title</title>
</track>
*/

echo '</xml>';

?>

.php로 저장


18
꺾쇠 괄호 및 앰퍼샌드와 같은 XML 메타 문자가있는 변수를 보간 할 때 오류가 발생하기 쉽습니다.
Matthew Lock

15

FluidXML 을 사용하면 XML을 매우 쉽게 생성 할 수 있습니다.

$tracks = fluidxml('xml');

$tracks->times(8, function ($i) {
    $this->add([
        'track' => [
            'path'  => "song{$i}.mp3",
            'title' => "Track {$i} - Track Title"
        ]
    ]);

});

https://github.com/servo-php/fluidxml


2
마지막 릴리스의 FluidXML은 PHP 5를 지원합니다 .
Daniele Orlando

4
SimpleXML을 사용하여 기본 PHP에서 쉽게 수행 할 수있는 작업을 수행하는 외부 라이브러리는 솔루션이 아닙니다.
robertmain

4

Tiny But Strong 템플릿 시스템을 살펴보십시오 . 일반적으로 HTML 템플릿에 사용되지만 XML 파일과 작동하는 확장명이 있습니다. 하나의 코드 파일과 두 개의 템플릿 파일 (htm 및 xml)을 가질 수있는 보고서를 작성하는 데 광범위하게 사용하며 사용자는 보고서를 화면 또는 스프레드 시트로 보낼지 여부를 선택할 수 있습니다.

또 다른 장점은 XML을 처음부터 코딩 할 필요가 없다는 것입니다. 경우에 따라 매우 큰 복잡한 스프레드 시트를 내보내고 싶었지만 모든 내보내기를 코딩하는 대신 기존 스프레드 시트를 저장하는 것만으로도 필요한 모든 내보내기 데이터 출력이 필요한 코드 태그에서 xml 및 대체. 빠르고 효율적인 작업 방법입니다.


-14
$query=mysql_query("select * from tablename")or die(mysql_error()); 
$xml="<libraray>\n\t\t";
while($data=mysql_fetch_array($query))
{

    $xml .="<mail_address>\n\t\t";
    $xml .= "<id>".$data['id']."</id>\n\t\t";
    $xml .= "<email>".$data['email_address']."</email>\n\t\t";
    $xml .= "<verify_code>".$data['verify']."</verify_code>\n\t\t";
    $xml .= "<status>".$data['status']."</status>\n\t\t";
    $xml.="</mail_address>\n\t";
}
$xml.="</libraray>\n\r";
$xmlobj=new SimpleXMLElement($xml);
$xmlobj->asXML("text.xml");

간단하게 데이터베이스에 연결하면 프로젝트 폴더에 test.xml 파일이 생성됩니다.


26
프로덕션에서는 절대 볼 수없는 코드입니다. 출력하는 데이터에 따라 유효하지 않은 (즉, 구문 분석 할 수없는) XML을 만들 수 있습니다. 기껏해야 느슨해 보이지만 몇 줄의 코드를 저장하여 쉽게 보일 수 있지만 유지 관리 및 디버깅 측면에서 비용이 더 많이 듭니다. 언젠가 당신의 일에 대한 책임을 맡을 가난한 사람은 말할 것도 없습니다.
Arne

3
-1 먼저 문자열을 wanna-be-xml로 연결 한 다음 해당 문자열을 SimpleXML로 푸시합니다.-거꾸로 뒤집힌 것 같습니다. 대신 먼저 XML 라이브러리 오브젝트를 초기화 한 다음이를 사용하여 XML을 빌드하십시오. 더 쉽고 메모리를 적게 사용하며 오류가 적으며 XML을 파일 또는 stdout으로 스트리밍 할 수 있습니다.
hakre

2
이 답변을 삭제해야 할 때가 있습니다.
Jose Manuel Abarca Rodríguez

나는 그것이 있어야한다고 생각합니다. XML로 처음 작업 할 때 코드를 직접 만들었는데 약간 비슷해 보였으므로하지 말아야 할 것을 보는 것이 매우 도움이되었습니다.
피터 Højlund 안데르센
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.