如何使用Nokogiri在XML的<moto>标签中插入true文本内容?
给Nokogiri生成的XML节点添加文本内容的解决方法
嘿,我懂你现在遇到的问题——用Ruby的Nokogiri修改XML时,生成的<moto/>是空的自闭合标签,而你需要的是<moto>true</moto>这种带文本内容的标签。其实只需要给节点添加上文本内容就行,下面给你几种可行的修改方式:
方法一:创建节点后设置文本内容
直接在你原来的代码基础上,给新创建的节点添加content赋值语句:
doc = Nokogiri::XML(....file...) doc.children.each do |node| if node.name == 'payment_transaction' span = Nokogiri::XML::Node.new "moto", doc span.content = "true" # 关键:给节点设置文本内容 node.add_child(span) end end
方法二:更简洁的链式写法
如果你喜欢更紧凑的代码,可以用tap方法一步完成节点创建和文本设置:
doc = Nokogiri::XML(....file...) doc.children.each do |node| if node.name == 'payment_transaction' node.add_child(Nokogiri::XML::Node.new("moto", doc).tap { |n| n.content = "true" }) end end
方法三:使用create_element直接生成带文本的节点
Nokogiri还提供了更直观的create_element方法,第二个参数可以直接传入节点文本:
doc = Nokogiri::XML(....file...) doc.children.each do |node| if node.name == 'payment_transaction' moto_node = doc.create_element("moto", "true") node.add_child(moto_node) end end
为什么原来的代码会生成空标签?因为你只创建了节点对象,但没有给它设置任何文本内容,Nokogiri默认就会生成自闭合的空标签。只要给节点的content属性赋值,它就会变成包含文本的完整标签啦。
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

