LuaLaTeX 元素及其属性值 find

LuaLaTeX 元素及其属性值 find

我需要查找<ELEMENT attr="A2">并打印 PDF 格式的文件。如何实现。我的 MWE 是:

\documentclass{article}
\usepackage{luacode}
\begin{luacode*}
xml = require('luaxml-mod-xml')
handler = require('luaxml-mod-handler')
\end{luacode*}
\begin{document}
\begin{luacode*}
sample = [[
<DATA>
  <TITLE>Quantum vacuum ç under mixed boundary conditions: the case for curved spacetime</TITLE>
  <NAME="name" />
  <VERSION="1" />
  <VARIABLES>
    <TEST>
      <ELEMENT attr="A1">123.000000001</ELEMENT>
      <ELEMENT attr="A2">789.000000001</ELEMENT>
    </TEST>
  </VARIABLES>
</DATA>]]
treehandler = handler.simpleTreeHandler()
x = xml.xmlParser(treehandler)
x:parse(sample)
tex.sprint(treehandler.root["DATA"]["TITLE"])

tex.sprint(treehandler.root["DATA"]["VARIABLES"]["TEST"]["ELEMENT"])

\end{luacode*}
\end{document}

是否可以直接使用 UTF 并&#x00E7;运行我的 XML?

答案1

最好使用luaxml-domobject库,因为它提供了更高级别的接口并修复了一个致命问题simpleTreeHandler- 它没有在混合顺序 XML 中保持正确的元素顺序。例如,它使其适合 HTML。当我将它用于ods文件包。它无法保持表格单元格中格式化元素的正确顺序。它是 LuaXML 库的原始部分,虽然它看起来最容易使用,但当你遇到这个问题时,你会发现这是无法修复的。最好避免它。真的。

无论如何,我将展示simpleTreeHandler和的解决方案DOM Object

\documentclass{article}
\usepackage{luacode}
\begin{luacode*}
xml = require('luaxml-mod-xml')
handler = require('luaxml-mod-handler')
\end{luacode*}
\begin{document}
\begin{luacode*}

sample = [[
<DATA>
  <TITLE>Quantum vacuum ç under mixed boundary conditions: the case for curved spacetime</TITLE>
  <NAME="name" />
  <VERSION="1" />
  <VARIABLES>
    <TEST>
      <ELEMENT attr="A1">123.000000001</ELEMENT>
      <ELEMENT attr="A2">789.000000001</ELEMENT>
    </TEST>
  </VARIABLES>
</DATA>]]
treehandler = handler.simpleTreeHandler()
x = xml.xmlParser(treehandler)
x:parse(sample)
tex.sprint(treehandler.root["DATA"]["TITLE"])

for _, element in ipairs(treehandler.root["DATA"]["VARIABLES"]["TEST"]["ELEMENT"]) do
  if element._attr["attr"] == "A2" then
    tex.sprint(element)
  end
end


\end{luacode*}
\end{document}

reehandler.root["DATA"]["VARIABLES"]["TEST"]["ELEMENT"]是一个表,因此您需要循环它并使用找到正确的属性element._attr["attr"] == "A2"

这是为以下版本重写的版本DOM Handler

\documentclass{article}
\usepackage{luacode}
\begin{document}
\begin{luacode*}
local domobject = require "luaxml-domobject"
sample = [[
<DATA>
  <TITLE>Quantum vacuum ç under mixed boundary conditions: the case for curved spacetime</TITLE>
  <NAME="name" />
  <VERSION="1" />
  <VARIABLES>
    <TEST>
      <ELEMENT attr="A1">123.000000001</ELEMENT>
      <ELEMENT attr="A2">789.000000001</ELEMENT>
    </TEST>
  </VARIABLES>
</DATA>]]
local dom = domobject.parse(sample)
tex.sprint(dom:query_selector("TITLE")[1]:get_text())

for _, element in ipairs(dom:query_selector("VARIABLES TEST ELEMENT")) do
  if element:get_attribute("attr") == "A2" then
    tex.sprint(element:get_text())
  end
end


\end{luacode*}
\end{document}

您可以使用函数解析 XML 文件domobject.parse()。它返回包含各种方法的对象。最有用的是dom:query_selector支持 CSS 之类的选择器。例如

dom:query_selector("TITLE") 

将返回<TITLE>文档中的所有元素。您可以使用通常的 Lua 表索引选择第一个元素。此选定对象仍然支持 DOM 方法,因此您可以使用该get_text方法检索文本:

dom:query_selector("TITLE")[1]:get_text()

第二个查询循环遍历所有VARIABLES/TEST/ELEMENT。它attr使用 方法从每个元素中检索属性get_attribute,并打印属性与值匹配的元素的内容A2

结果如下:

在此处输入图片描述

关于这个问题:

是否可以直接使用 UTF 并&#x00E7;运行我的 XML?

我想是的。您遇到了什么问题?

相关内容