如何扩展Ruby中Nokogiri代码以获取嵌套XML标签值?
如何扩展Ruby代码以获取嵌套XML标签的值?
我现在用这段Ruby代码尝试获取XML标签的值:
def value_from_xml_for(xml, tag) xml_body = Nokogiri::XML(xml) hash = Hash.from_xml(xml_body.to_s) hash.dig("payment_transaction", tag) end
我想要获取<country>标签的值,对应的XML结构是:
<payment_transaction> <card_holder>Automation Example</card_holder> <billing_address> <country>DE</country> </billing_address> </payment_transaction>
目前调用value_from_xml_for(xml, "country")返回的是nil,请问该怎么扩展这段代码来支持获取嵌套XML标签的值?
解决方案
问题出在你当前的代码只支持直接在payment_transaction下的一级标签,但country是嵌套在billing_address里的二级标签。我们可以修改代码,让tag参数支持点分隔的路径格式(比如"billing_address.country"),这样就能灵活获取任意层级的嵌套标签值了。
修改后的代码如下:
def value_from_xml_for(xml, tag_path) xml_body = Nokogiri::XML(xml) hash = Hash.from_xml(xml_body.to_s) # 将点分隔的路径拆分成数组,再用dig遍历 hash.dig("payment_transaction", *tag_path.split(".")) end
使用示例
调用的时候直接传入带点的路径:
# 假设xml变量是你的XML内容 country_value = value_from_xml_for(xml, "billing_address.country") puts country_value # 输出: DE
原理说明
- 用
split(".")把传入的tag_path(比如"billing_address.country")拆分成数组["billing_address", "country"] - 用Ruby的**展开运算符
***把数组元素作为单独参数传给dig方法,相当于执行hash.dig("payment_transaction", "billing_address", "country")
这样修改后,你的方法不仅能支持二级嵌套,还能支持更深层级的标签(比如如果有billing_address.city.postcode这种结构,直接传对应的点路径就能获取)。
另外,如果你不想用点分隔的方式,也可以让tag参数直接接受数组(比如["billing_address", "country"]),修改起来更简单:
def value_from_xml_for(xml, tags) xml_body = Nokogiri::XML(xml) hash = Hash.from_xml(xml_body.to_s) hash.dig("payment_transaction", *tags) end # 调用方式 country_value = value_from_xml_for(xml, ["billing_address", "country"])
两种方式都能解决你的问题,选哪种取决于你的调用习惯~
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

