2

我有一个大型表单(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'));

对于每个元素,这变得非常难以管理。

4

3 回答 3

1

像 Symfony 一样,您可以使用TWIG来处理您的 XML 模板的呈现。这将让您将所有 XML 保存在一个单独的文件中,然后您可以将已验证字段的 assoc 数组传递给TWIG 的渲染方法,然后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);
于 2013-07-21T10:18:04.393 回答
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} 替换为具体值来填充它。

于 2013-07-16T11:57:02.687 回答
0

DOMDocument 对象很好,但对于大型 XML 文件,您可能更喜欢使用XMLWriter,它允许您将 XML 文件作为流写入,而不是将其保存在内存中。

而不是createElementand appendChild,您将需要使用startElementandendElement和/或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

于 2013-07-16T13:43:45.107 回答