2013-07-10 1 views
2

큰 폼 (50 개 이상의 필드)을 가진 웹 사이트가 있습니다.PHP는 매번 동일한 옵션이지만 다른 값을 가진 큰 xml을 생성합니다.

각 필드는 필수 항목입니다. 양식을 제출 한 후에 모든 값을 xml 파일에 넣어야합니다.

XML 파일의 요소는 항상 같지만 값이 다릅니다.

나는 그들을 만드는 가장 좋은 방법을 찾으려고 노력해 왔으며 XML을위한 템플리트가 있다고 생각했습니다.

가장 좋은 방법은 무엇입니까?

은 현재 내가 이런 식으로 일을 해요 :

$m_content_tag = $doc->createElement("m_content"); 
$m_content_tag = $message_tag->appendChild($m_content_tag); 
$b_control_tag = $doc->createElement("b_control"); 
$b_control_tag = $m_content_tag->appendChild($b_control_tag); 
$b_control_tag->appendChild($doc->createElement('service_provider_reference_number')); 
$b_control_tag->appendChild($doc->createElement('intermediary_case_reference_number')); 

를 관리하는 것은 매우 어려운지고 각 요소에 대해서는.

답변

1

Symfony와 마찬가지로 TWIG을 사용하여 XML 템플릿 렌더링을 처리 할 수 ​​있습니다. 이렇게하면 모든 XML을 별도의 파일에 보관할 수 있으며 유효 필드의 배열을 TWIG's 렌더링 메서드로 전달하고 나머지는 TWIG이 처리합니다. 다른 XML 섹션을 다른 파일로 분해하여 동적으로 블록으로 포함 할 수도 있습니다.

XML 템플릿 :

<?xml version="1.0"?> 
<root> 
    <field_1>{{ var1 }}</field_1> 
    <field_2>{{ var2 }}</field_2> 
    <field_3> 
      {% for subvar in var3 %} 
       <subfield_3>{{ subvar }}</subfield_3> 
      {% endfor %} 
    </field_3> 
</root> 

PHP 코드 :

//Validate fields into assoc array 
$fields['var1'] = 'Some Value'; 
$fields['var2'] = 'Some other Value'; 
$fields['var3'] = array(1,2,3,4); 

//Set up TWIG 
$loader = new Twig_Loader_Filesystem('/path/to/templates'); 
$twig = new Twig_Environment($loader, array(
    'cache' => '/path/to/compilation_cache', 
)); 

//Render template 
echo $twig->render('xml_template.xml', $fields); 
+0

고마워, Theo! 참으로 위대한 답입니다! – CharliePrynn

+0

@CharliePrynn 문제 없습니다. 커뮤니티를 도울 수있어서 다행입니다. –

1

왜 이런 간단한 문자열 템플릿을 사용하지 않으시겠습니까?

$template = '<?xml version="1.0"?> 
<root> 
    <field_1>${field_1}</field1> 
    <field_2>${field_2}</field2> 
    <field_3> 
     <subfield_3>${subfield_3}</subfield_3> 
    </field3> 
</root>' 

$ {field_name}을 구체적인 값으로 바꾸어 값으로 채 웁니다.

+0

XML 파일이 크고, I는 다음과 같이 그 일을 생각은 혼란의 조금이 될 것입니다. – CharliePrynn

+0

xml 파일로 디스크에 저장하고 file_get_contents 함수로 문자열에로드 할 수 있습니다. 그런 다음 값으로 채우고 결과 xml로 저장하십시오. –

0

DOMDocument 객체는 좋지만 큰 XML 파일의 경우 XMLWriter을 사용하면 XML 파일을 메모리에 저장하는 대신 스트림으로 쓸 수 있습니다.

대신 createElementappendChild, 당신은 startElementendElement 및/또는 writeElement를 사용해야합니다.

그래서 대신 :

$m_content_tag = $doc->createElement("m_content"); 
$m_content_tag = $message_tag->appendChild($m_content_tag); 
$b_control_tag = $doc->createElement("b_control"); 
$b_control_tag = $m_content_tag->appendChild($b_control_tag); 
$b_control_tag->appendChild($doc->createElement('service_provider_reference_number')); 
$b_control_tag->appendChild($doc->createElement('intermediary_case_reference_number')); 

당신은 작성해야합니다 :이 쓰기 더 긴하지만,이 작업을 메모리를 적게 걸릴 것

$writer = new XMLWriter(); 
$writer->openURI('myfile.xml') 
$writer->startElement('messsage_tag'); 
$writer->startElement("m_content"); 
$writer->startElement("b_control"); 
$wrtier->writeElement('service_provider_reference_number', $value1); 
$wrtier->writeElement('intermediary_case_reference_number', $value2); 
$writer->endElement("b_control"); 
$writer->endElement("m_content"); 
$writer->endElement('messsage_tag'); 

.

그런데 50 필드 만 처리하면 DOMDocument를 계속 사용하기에 충분히 작다고 생각합니다.

DOMDocument를 사용하면 XSLTProcessor을 사용할 수 있으므로 XSLT 개의 파일을 XML의 템플릿 파일로 사용할 수 있습니다.

이이 방법으로 수행 할 수 있습니다

$xsl = new XSLTProcessor(); 
$xsldoc = new DOMDocument(); 
$xsldoc->load($xsl_filename); 
$xsl->importStyleSheet($xsldoc); 

$xmldoc = new DOMDocument(); 
$xmldoc->load($xml_filename); 
echo $xsl->transformToXML($xmldoc); 

을하지만 이것은 단지 다른 무언가로 DOMDocument 개체를 변환 달성 할 수 있습니다. 예를 들어, XSLTProcessor을 사용하여 배열을 DOM으로 변환 할 수는 없습니다.

관련 문제