如何在没有XML开始标记的情况下创建XML文件

时间:2018-02-05 16:28:50

标签: php xml simplexml

我使用PHP创建XML文件,这对我来说非常具有挑战性,因为我不是PHP的专家,但输出并不理想。问题:如何创建所需的输出?

澄清:我需要这个,因为此文件将合并到另一个动态创建的XML文件中,其中XML开头标记会导致以下错误:XML declaration allowed only at the start of the document

输出:

<?xml version="1.0"?>
<items>
  <page description="template4" type="4" duration="5000" on="saturday"/>
  <page description="template4" type="4" duration="5000" on="sunday"/>
  <page description="template4" type="4" duration="5000" on="sunday"/>
  <page description="template4" type="4" duration="5000" on="sunday"/>
  <page description="template4" type="4" duration="5000" on="today"/>
</items>

所需的输出:(我知道这不是有效的XML,但根据定义,它仍称为.xml文件。

<page description="template4" type="4" duration="5000" on="saturday"/>
<page description="template4" type="4" duration="5000" on="sunday"/>
<page description="template4" type="4" duration="5000" on="sunday"/>
<page description="template4" type="4" duration="5000" on="sunday"/>
<page description="template4" type="4" duration="5000" on="today"/>

PHP:

$xmldata = new SimpleXMLElement('<items />');

for ($i=0; $i < count($_POST['data']); $i++) {
  $xmlpage = $xmldata->addChild('page');
  $xmlpage->addAttribute('description', 'template4');
  $xmlpage->addAttribute('type', '4');
  $xmlpage->addAttribute('duration', '5000');
  $xmlpage->addAttribute('on', $_POST['data']['bday' . $i . '']['when']);
}

$xmldata->asXML('xml/playlistbdays.xml');

我试过了:

  • $xmldata = new SimpleXMLElement('');,提出错误说:String could not be parsed as XML
  • 2 个答案:

    答案 0 :(得分:0)

    您可以在保存之前替换字符串中的数据:

    $str = $xmldata->asXML(); // get as string instead of saving file
    $str = str_replace(['<?xml version="1.0"?>','<items>','</items>'],'',$str); // remove tags you don't want.
    file_put_contents('xml/playlistbdays.xml', trim($str)) ; // save file
    

    答案 1 :(得分:0)

    由于OP的总体目标是合并XML文档(此文件将合并到另一个动态创建的XML文件),请考虑PHP的importNode合并XML文件,而无需删除xml声明头。下面的示例将 items 导入 orders xml:

    $input_str = '<?xml version="1.0"?>
                  <orders>
                    <order_id>41412</order_id>
                  </orders>';
    
    $input = new DOMDocument('1.0', 'UTF-8'); 
    $input->loadXML($input_str);
    
    $items_str = '<?xml version="1.0"?>
                  <items>
                    <page description="template4" type="4" duration="5000" on="saturday"/>
                    <page description="template4" type="4" duration="5000" on="sunday"/>
                    <page description="template4" type="4" duration="5000" on="sunday"/>
                    <page description="template4" type="4" duration="5000" on="sunday"/>
                    <page description="template4" type="4" duration="5000" on="today"/>
                  </items>';
    
    $items = new DOMDocument('1.0', 'UTF-8'); 
    $items->loadXML($items_str);
    
    $new_node = $input->importNode($items->documentElement, TRUE);    
    $input->documentElement->appendChild($new_node);
    
    echo $input->saveXML();
    #    <?xml version="1.0"?>
    #    <orders>
    #       <order_id>41412</order_id>
    #       <items>
    #         <page description="template4" type="4" duration="5000" on="saturday"/>
    #         <page description="template4" type="4" duration="5000" on="sunday"/>
    #         <page description="template4" type="4" duration="5000" on="sunday"/>
    #         <page description="template4" type="4" duration="5000" on="sunday"/>
    #         <page description="template4" type="4" duration="5000" on="today"/>
    #       </items>
    #   </orders>