使用Nokogiri创建带有命名空间的XML元素

4
我使用Nokogiri创建XML。我希望拥有以下结构:
<content:encode>text</content>

我尝试了这段代码:
xml.content['encoded'] {xml.text "text"}

但是它给我一个错误。

我该如何正确编写?类似的例子在引用声明的命名空间中。


1
做得好,告诉我们你尝试了什么代码。将来,你应该始终提供你收到的确切错误消息,而不仅仅是说你遇到了错误。 - Phrogz
1个回答

11
  1. 你的例子没有意义;你说你想要"encode",然后你试图写"encoded"。

  2. 你的例子没有意义,因为它不是有效的XML。你有一个带有命名空间content的开放encode标签,然后你尝试用content标签关闭它。你想要的是<content:encode>text</content:encode>或者你想要<encode:content>text</encode:content>(你想要哪一个?)

  3. 你没有按照你给出的链接中的示例来操作。如果你想要一个命名空间为encodedcontent元素,那么根据示例,你应该这样写:

  4. xml['encoded'].content{ xml.text "text" }
    
  5. 然而,正如该示例所示,你必须声明你想要引用的任何命名空间。因此,请执行以下操作:

  6. require 'nokogiri'
    
    builder = Nokogiri::XML::Builder.new do |xml|
      xml.root('xmlns:encoded' => 'bar') do
        xml['encoded'].content{ xml.text "text" }
      end
    end
    puts builder.to_xml
    #=> <?xml version="1.0"?>
    #=> <root xmlns:encoded="bar">
    #=>   <encoded:content>text</encoded:content>
    #=> </root>
    

    编辑: 如果你确实只需要没有根元素的单个元素,使用Nokogiri太过浪费。只需执行:


    如果要翻译的内容不完整,请提供完整的句子或段落。
    str = "Hello World"
    xml = "<encoded:content>#{str}</encoded:content>"
    puts xml
    #=> <encoded:content>Hello World</encoded:content>
    

    如果你确实需要使用 Nokogiri,但只想要第一个子根元素,请执行以下操作:

    xml_str = builder.doc.root.children.first.to_s
    #=> "<encoded:content>text</encoded:content>"
    

谢谢。但我们需要获取这样的结构。 encoded:content文本</encoded:content> <root xmlns:encoded="bar"> .... </root> - 额外的行,不需要。 - Delaf
@Delaf,我不理解你的评论。我写的内容没有帮助到你吗?你是说你不想/不需要在Nokogiri XML输出中换行吗? - Phrogz
你的例子是有效的。但它在代码中添加了额外的行 http://pastie.org/1581058 - Delaf
@Delaf 我已经编辑了答案,可能满足你的需求。 - Phrogz
你不知道你帮了我多少忙。谢谢。 - Diego Somar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接