如何替换DTD路径Nokogiri?

问题描述 投票:0回答:1

我正在打开具有以下内容的XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE relatos PUBLIC "-//SINCODH/DTD relatos 0.97" "relatos.dtd">
<relatos>
</relatos>

现在,我想将DOCTYPE标记替换为新的dtd:

<!DOCTYPE relatos SYSTEM "test/dummy/public/midtd.dtd">

我正在尝试使用此方法,但似乎首先我需要删除现有的dtd标签:

docnoko = Nokogiri::XML(doc)
docnoko.create_internal_subset("relatos", nil, "test/dummy/public/midtd.dtd")
ruby xml nokogiri
1个回答
0
投票

通常,Nokogiri可以非常轻松地替换节点或删除它们并在其中添加其他内容,但这需要一些变通方法:

require 'nokogiri'

old_doc = Nokogiri::XML(<<EOT)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE relatos PUBLIC "-//SINCODH/DTD relatos 0.97" "relatos.dtd">
<relatos>
  <foo />
  <bar />
</relatos>
EOT

创建新文档:

new_doc = Nokogiri::XML('<relatos/>')

看起来像这样:

new_doc.to_xml # => "<?xml version=\"1.0\"?>\n<relatos/>\n"

然后添加新的DTD:

new_doc.create_internal_subset('relatos', nil, 'test/dummy/public/midtd.dtd')

然后将旧文档中的节点附加到新文档中:

new_doc.at('relatos').children = old_doc.at('relatos').children

结果:

new_doc.to_xml # => "<?xml version=\"1.0\"?>\n<!DOCTYPE relatos SYSTEM \"test/dummy/public/midtd.dtd\">\n<relatos>\n  <foo/>\n  <bar/>\n</relatos>\n"

这是其中的代码:

require 'nokogiri'

old_doc = Nokogiri::XML(<<EOT)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE relatos PUBLIC "-//SINCODH/DTD relatos 0.97" "relatos.dtd">
<relatos>
  <foo />
  <bar />
</relatos>
EOT

new_doc = Nokogiri::XML('<relatos/>')

new_doc.create_internal_subset('relatos', nil, 'test/dummy/public/midtd.dtd')
new_doc.at('relatos').children = old_doc.at('relatos').children
© www.soinside.com 2019 - 2024. All rights reserved.