【问题标题】:PHP creating large xml with same options but different values each timePHP创建具有相同选项但每次值不同的大型xml
【发布时间】:2013-07-08 06:21:48
【问题描述】:

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

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

【问题讨论】:

    标签: xml templates large-data


    【解决方案1】:

    像 Symfony 一样,您可以使用 TWIG 来处理您的 XML 模板的呈现。这将让您将所有 XML 保存在一个单独的文件中,然后您只需将已验证字段的 assoc 数组传递给 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);
    

    【讨论】:

    • 非常感谢,西奥!多么棒的答案!
    • @CharliePrynn 没问题,很高兴我能帮助社区。​​span>
    【解决方案2】:

    为什么不使用这样的简单字符串模板?

    $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} 替换为具体值来填充值。

    【讨论】:

    • XML文件很大,我觉得这样弄会有点乱。
    • 您可以将其作为 xml 文件存储在磁盘上,并使用 file_get_contents 函数将其加载到字符串中。然后用值填充它并保存为结果 xml。
    【解决方案3】:

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

    您需要使用startElementendElement 和/或writeElement,而不是createElementappendChild

    所以而不是:

    $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;

    【讨论】:

      猜你喜欢
      • 2023-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-25
      相关资源
      最近更新 更多