是否存在一种(Lua)方法将 XML 数据读入 .tex 文件?

是否存在一种(Lua)方法将 XML 数据读入 .tex 文件?

我在文件中保存了大量.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>

相关内容