我需要查找<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 并ç
运行我的 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 并
ç
运行我的 XML?
我想是的。您遇到了什么问题?