Добавить dtd используя nokogiri builder - PullRequest
4 голосов
/ 25 декабря 2009

Я использую nokogiri для создания изображений SVG. Я хотел бы добавить правильную преамбулу xml и объявление DTD svg, чтобы получить что-то вроде:

<?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, потому что я использую его для других целей в своем проекте, и я хочу оставаться на низком уровне требований. У вас есть идеи?

Спасибо

Ответы [ 5 ]

5 голосов
/ 06 августа 2010

Ниже приведено примечание внизу страницы Nokogiri :: XML :: Builder (возможно, недавно добавленное), которое, я думаю, сработает:

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 голосов
/ 22 июня 2010

Теперь вы можете (не знаю, из какой версии) использовать Node # create_internal_subset для создания узла DTD. Для получения дополнительной информации см .: http://nokogiri.org/Nokogiri/XML/Builder.html

И, например, прокрутите вниз до раздела «Типы документов».

1 голос
/ 31 марта 2017

Для тех, кто работает с HTML, пример Эрика Уокерса не совсем работает, поскольку автоматически добавляется тип документа. Вы должны сначала удалить его:

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. <!DOCTYPE html>

1 голос
/ 29 декабря 2009

Вот возможное решение, хотя это выглядит как подвох:

#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)
0 голосов
/ 25 декабря 2009

По-видимому, нет способа добавить тип документа с помощью Nokogiri::XML::Builder. Однако добавление декларации doctype в XML-документ очень сомнительно, если только это не требуется вашим инструментам. Прочитайте DTD, которые не работают в Интернете. Автор: Анри Сивонен по ряду причин, почему не очень хорошая идея использовать DTD, и вместо этого вы должны убедиться, что ваш документ правильно сформирован, и проверить его на соответствие внешним схема (которая может быть DTD или может быть чем-то более мощным, например, XSD или RELAX-NG), а не DTD, встроенная в документ.

...