我的网站形式很大(50多个字段)。
每个字段都是必填字段。提交表单后,我需要将所有值放入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'));
对于每个难以管理的元素。
答案 0 :(得分: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}来填充值。
答案 1 :(得分: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);
答案 2 :(得分:0)
DOMDocument对象很好,但是对于大型XML文件,您可能更喜欢使用XMLWriter,它允许您将XML文件编写为流而不是将其保存在内存中。
而不是createElement
和appendChild
,您需要使用startElement
和endElement
和/或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
;