2013-10-31 4 views
1

PHP로 XML 문서를 만들고 싶습니다.쉬운 방법으로 PHP로 XML 문서 만들기

DOMDocument를 선택했는데 createElement, createTextNode, appendChild 등과 같은 메서드를 사용해야 만 XML을 작성할 수 있다는 것을 알고 있습니다.

내가 하나의 노드를 포함하는 차량 정보와 XML을 생성하는 방법이다 : 대답에 내가 XML을 구축하려는 경우 어떻게

<?php 
$doc = new DOMDocument ('1.0', 'utf-8'); 
$vehicles = $doc->createElement ("Vehicles"); 

$vehicle = $doc->createElement("Vehicle"); 
$vehicle_num = $doc->createElement("Number"); 
$vehicle_desc = $doc->createElement("Description"); 
$vehicle_year = $doc->createElement("Year"); 
$vehicle_make = $doc->createElement("Make"); 
$vehicle_model = $doc->createElement("Model"); 
$vehicle_color = $doc->createElement("Color"); 

$vehicle_num->appendChild($doc->createTextNode("AW2CM31Y8")); 
$vehicle_year->appendChild($doc->createTextNode("2013")); 
$vehicle_make->appendChild($doc->createTextNode("VOLKSWAGEN")); 
$vehicle_model->appendChild($doc->createTextNode("NEW BEETLE")); 
$vehicle_color->appendChild($doc->createTextNode("Black")); 

$vehicle_desc->appendChild($vehicle_year); 
$vehicle_desc->appendChild($vehicle_make); 
$vehicle_desc->appendChild($vehicle_model); 
$vehicle_desc->appendChild($vehicle_color); 

$vehicle->appendChild($vehicle_num); 
$vehicle->appendChild($vehicle_desc); 

$vehicles->appendChild($vehicle); 
$doc->appendChild ($vehicles); 

header ("Content-type: text/xml"); 
echo $doc->saveXML(); 

하지만를, (100 개)뿐만 아니라 차량 정보를 포함하는 노드뿐만 아니라 다른 노드 위아래로. 이 과정은 너무 어려울 것입니다.

그래서 노드를 만들고 PHP에서 xml로 값을 추가하는 쉬운 방법이 있습니까? 필자는 작성해야 할 코드 줄 수에 대해 우려하고 있습니다.

+2

나는 * 당신과 같은 기술적 인 질문을 할 수있는 권리 용어입니다 낙관적 * 있는지 확실하지 않습니다.XML은 직렬화 형식 일 뿐이므로 "코드"로만 작성하는 대신 데이터를 자체 데이터 구조로 분리해야합니다. 그런 다음 데이터 구조를 기반으로 XML을 만드는 코드를 작성하십시오. 그것은 내가 솔직하게 줄 수있는 최고의 조언이다. – hakre

+0

@hakre 지금 내 질문을 수정했습니다. –

+0

일반 xml로 쓸 수 있습니까? 또는 XML로 내보낼 데이터 소스가 for (each) 루프를 사용합니까? – TiMESPLiNTER

답변

1

마음에 가장 먼저 떠오르는 것은 코드 반복이 있다는 것입니다. 아마도 그것을 줄이기를 원할 것입니다. 이것은 중복 코드를 자신의 함수로 옮겨서 수행 할 수 있습니다.

그렇게 빨리하려면 PHP가 클로저를 사용합니다. 그 라인을 올리 자.

당신은 차량의 수집 물을 가지고있다. 그리고 각 차량은 단지 속성과 값을 가지고있다. 그래서 당신은 차량에 속성을 추가합니다. BTW, createElement은 이미 텍스트 노드를 만들 필요가 없도록 텍스트를 값으로 사용합니다. 따라서 중복 코드를 함수로 묶은 다음이 함수를 호출하여 XML을 만듭니다. 이미 매개 변수화를 통해 - 구조를 보여줍니다. 다만 함수의 정의 (제 1 부) 및 그 (초 부분)에 적용마다 다를 :

모든 기능은 상기 제 2 부분에 정의 된 그래서 후
<?php 
/** 
* Create XML Document with PHP in an easy way 
* 
* @link http://stackoverflow.com/q/19702911/367456 
*/ 

/** 
* @param DOMNode $node 
* @return DOMDocument 
*/ 
$doc = function (DOMNode $node = NULL) { 
    return $node ? ($node->ownerDocument ? : $node) : new DOMDocument(); 
}; 

/** 
* @param DOMElement $element 
* @param string $property 
* @param string $text 
* @return DOMElement the element the proeprty was added to 
*/ 
$prop = function (DOMElement $element, $property, $text) { 
    return $element->appendChild(
     $element->ownerDocument->createElement($property, $text) 
    ); 
}; 

/** 
* @param DOMNode $element 
* @param string $name 
* @return DOMElement 
*/ 
$element = function (DOMNode $element, $name) use ($doc) { 
    return $element->appendChild(
     $doc($element)->createElement($name) 
    ); 
}; 

:

$prop(
    $vehicle = $element(
     $vehicles = $element(
      $doc() 
      , 'Vehicles' 
     ) 
     , 'Vehicle' 
    ) 
    , "Number" 
    , "AW2CM31Y8" 
); 

$prop(
    $vehicle 
    , "Year" 
    , "2013" 
); 

$prop(
    $vehicle 
    , "Make" 
    , "VOLKSWAGEN" 
); 

$prop(
    $vehicle 
    , "Model" 
    , "NEW BEETLE" 
); 

$prop(
    $vehicle 
    , "Color" 
    , "Black" 
); 

등이 있습니다. 이것은 어떤 구조를 드러내고있다. 코드 중복도 제거되었습니다. 남아있는 유일한 방법은 마지막으로 결과를 반향하는 것입니다

당신은 심지어 문자 그대로 XML을 생성하는 데이터 구조를 반대한다는 것을 읽을 수있는 코드를 보면
header("Content-type: text/xml"); 
echo $doc($vehicles)->saveXML(); 

. 그래서 다음 일은 어떤 종류의 탐색 (traversal)을 사용하는 것입니다. 그러나 그것은 먼저 데이터 구조의 정의를 필요로합니다. 코드 구조의 정의는 지금까지 이루어 졌을뿐만 아니라 이미 사용되어야합니다. 당신을 위해).

온라인 예 : https://eval.in/59090

+0

@dskanth : 구조체를 실제로 보여 주므로 그 예제 코드에서 줄 바꿈/들여 쓰기를 제거하지 마십시오. 당신은 장황한 것을 발견 할 수 있습니다, 나는 그것을 더 두드러지게 만들기 위해 이것을 사용합니다. 아직 데이터 구조가 없으므로이 코드/구조가 실제로 중간 단계임을 유의하십시오. – hakre

+0

괜찮습니다. 답변 해주셔서 감사합니다. 잘 작동합니다. –

+1

글쎄, 일반적으로 코드 변환을 줄이기 위해 배열을 XML로 변환하는 것이 좋습니다. XML 구조를 업데이트 할 수있는 고급 예제는 다음과 같습니다. [배열을 사용하여 SimpleXMLElement를 업데이트하는 방법] (http://stackoverflow.com/a/14839271/367456) -이 예는 자세한 정보가 아닙니다. – hakre

0

xml을 동일한 구조로 만들고 템플릿으로 사용하는 것이 좋습니다. 따라서이 xml 만 채울 필요가 있습니다.

1

당신이 정말로 찾고있는 것은 내가 만든 문서에 대한 일종의 제어 기능을 가진 객체의 XML 직렬화입니다. 당신이 XmlSerializer가 프로젝트를보고 할 수 있습니다이를 위해

-https://bitbucket.org/schmijos/xmlserializer 배열/PHP 개체를 촬영하고 XML로 직렬화합니다

.

+0

링크를 가져 주셔서 감사합니다. 유용하게 보입니다. –