ConTeXt:将 XML 文件读入缓冲区进行处理

ConTeXt:将 XML 文件读入缓冲区进行处理

我有一个非常(非常)长的 XML 文件,我正在使用 ConTeXt 将其转换成一本书。

这可以读取文件并按原样输出:

\starttext

\startbuffer[test]
\input /Users/ramfub/Documents/complete_advent.xml
\stopbuffer

\getbuffer[test]

\stoptext

\startbuffer如果我在和命令之间复制 XML 文件的内容\stopbuffer,它可以正常工作:

\startbuffer[test]
<EveningPrayer>
<TitleSection>
<Title>First Sunday of Advent</Title>
<PsalterWeek>Psalter, Week I</PsalterWeek>
<Hour>Evening Prayer I</Hour>
</TitleSection>
<Hymn>
...
<CollectLine></CollectLine>
<CollectLine></CollectLine>
</Collect>
</DaytimePrayer>

\stopbuffer

(xmlsetups)

\xmlprocessbuffer{test}{test}{}

但是,如果我尝试将 XML 文件读入缓冲区,它不起作用(没有错误,但根本没有输出):

\startbuffer[test]
\input /Users/ramfub/Documents/complete_advent.xml
\stopbuffer

(xmlsetups)

\xmlprocessbuffer{test}{test}{}

我不想将 10,000 多页 XML 复制到我的 .tex 文件中。

答案1

您不必先将文件读入缓冲区。可以\xmlprocessfile直接处理 XML 文件。

在此处输入图片描述

欲了解更多信息,请阅读XML 手册 (PDF)


如果您由于某种原因想要将文件读入缓冲区,例如在 Lua 中对其进行预处理等,您可以轻松地自己实现这样的宏。

\startluacode
function buffers.fromfile(name,file)
    if not buffers.exists(name) then
        buffers.assign(name,io.loaddata(resolvers.findfile(file)))
    end
end

interfaces.implement {
    name      = "readbufferfromfile",
    actions   = buffers.fromfile,
    arguments = { "string", "string" }
}
\stopluacode

\unprotect

\unexpanded\def\readbufferfromfile{\dodoubleempty\doreadbufferfromfile}
\def\doreadbufferfromfile[#1][#2]{\clf_readbufferfromfile{#1}{#2}}

\protect

\starttext

\readbufferfromfile[name][test.xml]

\typebuffer[name]

\stoptext

相关内容