我在文件中保存了大量.xml
如下数据:
<DATA>
<NAME="name" />
<VERSION="1" />
<VARIABLES>
<TEST>
<ELEMENT atr="0" atr2="1">123456.000000001</ELEMENT>
</TEST>
</VARIABLES>
</DATA>
我必须编写大量模板来读取这些数据以进行文档编制,我想使用 LaTeX 来完成这项工作。是否存在任何方法可以将这些数据写入文件.tex
?我想编写一个文件,其中每个文件{SOMETHING/SOMETHINGELSE}
都由 XML 值替换。额外的好处是可以将其四舍五入。由于我使用的是 LuaLaTeX,我猜这种语言中可能存在一种方法。但任何其他可能性对我来说也很有趣。不幸的是,我不是脚本专家,但如果你说,我应该用 python 来做这件事(我愿意学习......),我会将其移至另一个 SX 页面。
该文件看起来应该是这样的:
% arara: lualatex
\documentclass{article}
\usepackage{booktabs}
\usepackage{siunitx}
\begin{document}
\section{VolumeFlows}
A variable: $x=\SI{{VARIABLES/TEST/ELEMENT}}{\metre}$
\begin{table}%
\centering
\begin{tabular}{l S}
\toprule
Name & {Value}\\
\midrule
A variable & {VARIABLES/TEST/ELEMENT}\\
\bottomrule
\end{tabular}
\end{table}
\end{document}
答案1
以下是luaxml
“包裹”。
\documentclass{article}
\usepackage{luacode}
\begin{luacode*}
xml = require('luaxml-mod-xml')
handler = require('luaxml-mod-handler')
\end{luacode*}
\begin{document}
\begin{luacode*}
sample = [[
<DATA>
<NAME="name" />
<VERSION="1" />
<VARIABLES>
<TEST>
<ELEMENT atr="0" atr2="1">123456.000000001</ELEMENT>
</TEST>
</VARIABLES>
</DATA>]]
treehandler = handler.simpleTreeHandler()
x = xml.xmlParser(treehandler)
x:parse(sample)
tex.sprint(treehandler.root["DATA"]["VARIABLES"]["TEST"]["ELEMENT"])
\end{luacode*}
\end{document}
编辑
可能会好一点,但是我已经很久没有写过一些 lua 代码了……
% arara: lualatex
\documentclass{article}
\usepackage{siunitx}
\usepackage{booktabs}
\usepackage{luacode}
\begin{luacode*}
xml = require('luaxml-mod-xml')
handler = require('luaxml-mod-handler')
treehandler = handler.simpleTreeHandler()
xmlparser = xml.xmlParser(treehandler)
function readxmlfile(filename)
local f = assert(io.open(filename, 'r'))
local t = f:read('*all')
f:close()
return t
end
function parsexmlstring(string)
xmlparser:parse(string)
end
\end{luacode*}
\def\parsexmlfile#1{%
\directlua{%
parsexmlstring(readxmlfile('#1'))}}
\def\getxmlvalue#1#2#3#4{%
\directlua{%
tex.sprint(treehandler.root['#1']['#2']['#3']['#4'])}}
\parsexmlfile{sample.xml}
\begin{document}
Variable: $x=\SI[round-mode=places,round-precision=1]{\getxmlvalue{DATA}{VARIABLES}{TEST}{ELEMENT}}{\metre}$
\begin{table}%
\centering
\begin{tabular}{l S[round-mode=places,round-precision=4]}
\toprule
Name & {Value}\\
\midrule
A variable & \getxmlvalue{DATA}{VARIABLES}{TEST}{ELEMENT}\\
\bottomrule
\end{tabular}
\end{table}
\end{document}
和sample.xml
<DATA>
<NAME="name" />
<VERSION="1" />
<VARIABLES>
<TEST>
<ELEMENT atr="0" atr2="1">123456.000000001</ELEMENT>
</TEST>
</VARIABLES>
</DATA>