【问题标题】:php - generating an XML file with XMLWriterphp - 使用 XMLWriter 生成 XML 文件
【发布时间】:2017-02-27 13:31:55
【问题描述】:

我正在尝试通过以下循环创建一个包含人员及其子女姓名的 XML 文件:

$xml_file = new XMLWriter();

$xml_file->startElement("People");

while ($list_of_people->current != NULL ){

    $xml_file->writeElement("Person"); // create a new person

    $xml_file->startElement('Person'); 

    $xml_file->writeAttribute('name', $list_of_people->current->name); // add their name as an attribute 

    if ($list_of_people->current->children != NULL){ 

        while ($list_of_people->current->child_current != NULL){ // if they have children create them as well 

            $xml_file->writeElement("Person");

            $list_of_people->startElement('Person'); 

            $xml_file->writeAttribute('name', $list_of_people->current->child_current->child_name);

            $xml_file->endElement(); 

            $list_of_people->current->child_current = $list_of_people->current->child_current->next;
        }
    } 

    $xml_file->endElement(); 

    $list_of_people->current = $list_of_people->current->next;
}

如您所见,在输出文件中,我应该有多个名为“Person”的元素,具体取决于列表中有多少人以及其中有多少人有孩子。

我希望最终的 XML 文档看起来像这样的一个示例:

<People>
 <Person name="Anna"></Person>
 <Person name="Joe">
   <Person name="Willy"></Person> // Joe has a child named Willy
 </Person>
<Person name="Rob"></Person>
</People>

现在,我关心的是,我怎么知道 $xml_file->startElement('Person');选择了我刚刚创建的当前人员,而不是之前已经创建的任何 Person 元素,因为它们都命名相同?

如果最终 XML 文件中的各个元素具有相同的名称,如何访问它们?

最后,我想保存这个 XML 文档并将其内容打印到标准输出。

谢谢!

【问题讨论】:

    标签: php xml xmlwriter


    【解决方案1】:

    startElement 方法不会选择当前人,它会启动另一个人。事实上,您可以使用 writeElement 或 startElement 添加元素,但无需同时使用两者。

    看这个例子:

    <?php
        $people = array(
            array('name' => 'Anne', 'children' => array()),
            array('name' => 'Joe', 'children' => array(array('name' => 'Willy')))
        );
    
        //create a new xmlwriter object
        $xml = new XMLWriter(); 
    
        // Used to write to xml file - uncomment the next line to print xml to a file
        // $xml->openURI('people_test.xml');
    
        // used for string output from memory
        $xml->openMemory(); // comment this line to print xml to a file
    
        //set the indentation to true
        $xml->setIndent(true);
    
        //create the document tag
        $xml->startDocument();
    
        $xml->startElement("People"); // start People
    
        foreach($people as $person) {
    
            $xml->startElement("Person"); // start Person
            $xml->writeAttribute('name', $person['name']);
    
            if(!empty($person['children'])) {
                foreach($person['children'] as $child) {
                    $xml->startElement("Person"); // start Person
                    $xml->writeAttribute('name', $child['name']);
                    $xml->endElement();
                }
            }
            $xml->endElement(); //End Personn
    
        }
    
        $xml->endElement(); //End People
    
        // Display thue current buffer
        echo $xml->flush(); 
    
    
    ?>
    

    【讨论】:

    • 感谢您的这篇文章!我现在对此有了更好的理解:) 但是,我在这里遇到了一个问题。生成的子节点不以“Person”标签结尾,而是如下所示: 即使在内循环中调用了 endElement 函数。
    • Il 应该是一样的。见:stackoverflow.com/questions/7231902/…
    猜你喜欢
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    相关资源
    最近更新 更多