【问题标题】:Add a dtd using nokogiri builder使用 nokogiri builder 添加 dtd
【发布时间】:2010-12-30 00:10:59
【问题描述】:

我正在使用nokogiri 来生成 svg 图片。我想添加正确的 xml 序言和 svg DTD 声明以获得类似:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 
<svg>
...

使用builder,我可以使用instruct!declare!,但我想坚持使用nokogiri,因为我在我的项目中将它用于其他目的,并且我想保持低要求。你有什么想法吗?

谢谢

【问题讨论】:

    标签: xml ruby nokogiri dtd


    【解决方案1】:

    以下内容来自Nokogiri::XML::Builder page 底部的注释(可能是最近添加的),我认为它可以解决问题:

    builder = Nokogiri::XML::Builder.new do |xml|
      xml.doc.create_internal_subset(
        'html',
        "-//W3C//DTD HTML 4.01 Transitional//EN",
        "http://www.w3.org/TR/html4/loose.dtd"
      )
      xml.root do
        xml.foo
      end
    end
    
    puts builder.to_xml
    

    【讨论】:

      【解决方案2】:

      您现在可以(不知道从哪个版本开始)使用 Node#create_internal_subset 创建 DTD 节点。欲了解更多信息,请参阅:http://nokogiri.org/Nokogiri/XML/Builder.html

      并向下滚动到“文档类型”部分以获取示例。

      【解决方案3】:

      这是一个可能的解决方案,虽然它看起来像一个肮脏的把戏:

      #1. I build the svg document
      builder = Nokogiri::XML::Builder.new do |xml|
        xml.svg do
          # ...
        end
      end
      
      #2. I retrieve the svg root node
      svg = builder.doc.xpath("/svg").first
      
      #3. I define and parse an xml document with the required preamble and dtd
      str =<<EOS
      <?xml version="1.0" standalone="no"?>
      <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1. /DTD/svg11.dtd">
      EOS
      doc = Nokogiri::XML::Document.parse(str)
      
      #4. I add the svg node to the document above
      doc.add_child(svg)
      

      【讨论】:

        【解决方案4】:

        对于那些使用 HTML 的人,Eric Walkers 的示例不太适用,因为会自动添加文档类型。您需要先将其删除:

        builder = Nokogiri::HTML::Builder.new do |html|
          html.doc.internal_subset.remove
          html.doc.create_internal_subset('html', nil, nil)
        end
        

        这将添加 HTML5 文档类型 a.k.a. &lt;!DOCTYPE html&gt;

        【讨论】:

          【解决方案5】:

          似乎没有任何方法可以使用Nokogiri::XML::Builder 添加文档类型。但是,向 XML 文档添加 doctype 声明的实用性值得怀疑,除非您的工具需要它。阅读DTDs Don't Work on the Web by Henri Sivonen 出于某些原因,为什么使用 DTD 不是一个好主意,您应该确保您的文档格式正确,并根据外部模式(可能是 DTD,或者可能是更强大的东西)对其进行验证像 XSD 或 RELAX-NG)而不是文档中嵌入的 DTD。

          【讨论】:

            猜你喜欢
            • 2022-01-18
            • 1970-01-01
            • 2015-04-03
            • 2013-07-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-17
            相关资源
            最近更新 更多