是否可以使用PHP以文档顺序将XML文档解析并输出到HTML?

时间:2013-04-02 22:50:01

标签: php html xml

如果这是在这里已经彻底讨论过的话,我道歉。我花了很多时间寻找答案,似乎无法挖掘出明确的答案。此外,在PHP方面,我几乎都是业余爱好者。

我有一个XML文档,我正在尝试使用PHP呈现为HTML。 XML实际上“理论上”用于单一来源,这意味着希望将其用作生成PDF和HTML输出的源。因此,XML实际上由作为手册部分的元素组成。见下文:

<topic>
   <title>Some topic.</title>
   <caution>
      <para>Cautionary note 1.</para>
   </caution>
   <para>Paragraph 1</para>
   <caution>
      <para>Cautionary note 2.</para>
   </caution>
   <para>Paragraph 2</para>
   <figure>
      <graphic src="../some_path"/>
   </figure>
</topic>

对于PDF,我打算编写一个XSLT转换。对于HTML,我有一个脚本可以成功地将XML的所有元素转换为HTML。问题是,它似乎是将XML转换为已解析的数组。上面的示例使用(使用HTML等效项)渲染:

  • 顶部的所有数字元素。
  • 中间的所有para元素(不包括警告元素中的para元素)。
  • 底部的所有警告元素。

因此,不保留文档顺序。由于此源用于组合手册,因此文档顺序很重要。

我的问题:是否可以使用PHP将XML解析为HTML并保留文档顺序?再说一次,我几乎是一个PHP爱好者,所以如果我的问题看起来很迟钝,我会道歉。欢迎任何建议或指示。

编辑添加一些PHP

PHP脚本非常冗长,所以我将尝试尽可能多地包含相关位。

就注意事项而言,脚本最初定义了一个函数:

//Display the cautions from the xml
        function display_cautions($cautions)
        {
            foreach( $cautions as $caution )
            {
                foreach( $caution->para as $cautionpara )
                {
                    printf("<p class='Text'>");
                    foreach( $cautionpara->{'attention-icon'} as $attentionicon )
                    {
                        printf("<img src='../../images/%s' width='25px' height='25px'>", htmlspecialchars($attentionicon['srcfile']));
                    }
                    $cautionpara = str_ireplace('<emph>', '<b>', $cautionpara);
                    $cautionpara = str_ireplace('</emph>', '</b>', $cautionpara);
                    printf("%s</p>", htmlspecialchars($cautionpara));
                }
            }
        }

然后构建文档:

if (isset($_GET['ID']))  
        {
            $introsections = $doc->{'intro-section'};
            //printf("got here 1");
            foreach( $introsections as $introsection )
            {
                //printf("got here 2");
                $sectno = $introsection['sect-no'];
                if ($sectno == $_GET['ID'])
                {
                    $smtitle = $introsection->title->nodeValue;
                    $introgenerals = $introsection->{'intro-general'};
                    foreach( $introgenerals as $introgeneral )
                    {
                        //printf("got here 3");
                        $smtitle = $introgeneral->title;
                        $introid = $introgeneral['id'];
                        //Display the title
                        printf("<h2>%s</h2>", htmlspecialchars($smtitle));
                            //Match found
                            $topics = $introgeneral->topic;
                            foreach( $topics as $topic )
                            {
                                //Display the title
                                printf("<p class='Text12Bold'>%s</p>", htmlspecialchars($topic->title));
                                $topicparas = $topic->para;
                                //Get all the paragraphs
                                foreach( $topicparas as $topicpara )
                                {
                                    //MH added: code to include xrefs here
                                    //check for xrefs in this para
                                    $xrefs = $topicpara->xref;
                                    if (simple_xml_count($xrefs) > 0) {
                                        //printf("<p class='Text'>%s</p>\n", htmlspecialchars($topicpara));
                                        display_referral_links($xrefs, $topicpara);
                                    } else {
                                        $topicpara = str_ireplace('<emph>', '<b>', $topicpara);
                                        $topicpara = str_ireplace('</emph>', '</b>', $topicpara);
                                        ?>
                                        <p class='Text'><?php printf($topicpara) ?></p>

                                        <?php
                                    }
                                }

然后它调用警告功能:

//Get all the cautions with images where applicable
display_cautions($topic->caution);

在文档构造和函数调用之间,它构造表,子主题和图形。警告,备注和列表也有类似的功能。

0 个答案:

没有答案