0

我正在开发一个项目来创建一个解析器,该解析器采用存储在 XML 中的教科书并使用 PHP 将它们转换为 HTML。这是用于在线教育服务。我花了很多时间研究 PHP 中的 XML 解析器选项。从我所见,我相信我最好的选择是使用 DOMDocument 或 XMLReader(也许将它与 SimpleXML 混合)。

这些书被分成单独的文件,分别为 Front、Units、Chapter 和 Back。这是从外部源提供的,因此我无法控制 XML。话虽如此,我发现他们正在使用Syntext Serna Free来构建 XML 文档。

因此书籍以 ISBN# 命名,文件格式为 1234567890_ch01.xml。这是 XML 文档的一个示例。这是高度浓缩的可读性,因为实际文档是每个文档 700-1000 行,每个教科书大约 25 个文档。

<frontmatter id="1234567890_001_000003" page-num="i" filename="1234567890_001_fm01.xml" sourcefilename="prelims.pdf">
    <titleinfo id="1234567890_001_000004" page-num="i">
        <title id="1234567890_001_000005" page-num="i">I'm a Book Title</title>
        <subtitle id="1234567890_001_000006" page-num="i">I'm a subtitle</subtitle>
    </titleinfo>
    <creditinfo id="1234567890_001_000007" page-num="i">
        <author id="1234567890_001_000008" page-num="i">
            <name><emph type="bold">Senior Author</emph>
                <fname><emph type="bold">Bob</emph></fname>
                <lname><emph type="bold">Loblaw</emph></lname>
            </name>
            <organizationname>District School Board</organizationname>
        </author>
        <author id="1234567890_001_000009" page-num="i">
            <name><emph type="bold">Authors</emph>
                <fname><emph type="bold">Spongebob</emph></fname>
                <lname><emph type="bold">Squarepants</emph></lname>
            </name>
            <organizationname>District School Board</organizationname>
        </author>
    </creditinfo>
</frontmatter>

所以这是布局的基本思想。当然,它还有很多内容,但本质上它都是按父标签排序的。我在想我的策略是制作一个父标签列表,使用 SAX 解析器读取这些标签,然后将子标签转换为 SimpleXML 对象以便于使用。本质上保持相同的 XML 结构,但将其包装在 HTML 元素中,并将 XML 元素名称作为类或 id 名称,并将 XML 属性直接转换为 HTML 属性。

呸。好的,所以我的问题是……有没有人可以分享一些知识或经验来解析这种大小/复杂性的 XML 文档?对于这种规模的东西,推荐的策略是什么?

4

1 回答 1

0

我肯定会研究 Jani Hartikainen 对 XSLT 的建议。XSLT 是一种基于 XML 的语言,用于编写规则(称为“样式表”,但它们不同于 CSS 样式表)将任意 XML 文档(例如您正在处理的输入)转换为其他格式,包括 HTML(转换为HTML 是如此普遍,以至于 XSLT 有一些专用于它的功能)。PHP 有一个内置的 XSLT 处理器。

可能是教科书出版商已经有一些用于将教科书转换为 HTML 的 XSLT 样式表;您可能需要根据您的特定需求对它们进行一些修改,但这比从头开始编写自己的代码要容易得多且不易出错。

于 2013-03-19T00:56:19.107 回答