gpt4 book ai didi

xml - 使用 Crystal 从 XML::Nodeset 中的第一个节点检索值

转载 作者:数据小太阳 更新时间:2023-10-29 02:26:06 26 4
gpt4 key购买 nike

我正在使用 Crystal,并试图检索 XML 文档中节点的 ID:

<foo ID="bar"></foo>

我正在使用以下代码获取 ID

require "xml"
file = File.read("path/to/doc.xml")
xml = XML.parse(file)
xpath_context = XML::XPathContext.new(xml)
nodeset = xpath_context.evaluate("//foo/@ID")

如果我检查节点集,我会得到我期望的内容:

[#<XML::Attribute:0x1287690 name="ID" value="bar">]

nodeset.class返回 XML::NodeSet其中有 an instance method [] .所以我相信我应该能够这样做以获得值(value):

node = nodeset[0]
node.value

但是,当我调用 nodeset[0]我收到以下错误:

undefined method '[]' for Float64 (compile-time type is (String | Float64 | Bool | XML::NodeSet))

node = nodeset[0]

我不明白为什么 []方法将节点集视为 Float64,同时 inspectclass将其视为 XML::Nodeset .

我错过了什么?

String 有一个 [] 是巧合吗?方法,但 Float64 没有?

最佳答案

当您执行evaluate 时,返回类型是所有可能值的联合类型。在这种情况下,XML::NodeSet 是运行时类型(注意与编译时类型的区别)。

如果你能保证返回类型总是一个节点集,那么你可以简单地做:

nodeset = xpath_context.evaluate("//foo/@ID") as XML::NodeSet

但如果结果具有不同的类型,则会引发异常。另一种选择是有条件地进行:

if nodeset.is_a?(XML::NodeSet)
# use nodeset here without casting, the compiler will restrict the type
end

或者甚至使用 case 语句:

case nodeset
when XML::NodeSet
# ...
end

关于xml - 使用 Crystal 从 XML::Nodeset 中的第一个节点检索值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32651833/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com