微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Ruby中解析DTD文件

我试图将DTD文件转换为YAML文件,我尝试在lib XML和Nokogiri中加载它,但似乎DTD文件不是有效的XML文件.只要我可以解析DTD文件,我就可以使用任何第三方gem.

我尝试转换:

wget "http://xml.evernote.com/pub/enml2.dtd"
irb
require 'nokogiri'
xml = Nokogiri::XML::Document.parse('enml2.dtd')
xml.to_yaml
=> "--- !ruby/object:Nokogiri::XML::Document\ndecorators: \nnode_cache: []\nerrors:\n- !ruby/exception:Nokogiri::XML::SyntaxError\n  message: |\n    Start tag expected,'<' not found\n  domain: 1\n  code: 4\n  level: 3\n  file: \n  line: 1\n  str1: \n  str2: \n  str3: \n  int1: 0\n  column: 1\n"

任何在线XML验证器也会返回错误“Start tag expected”.我假设这是因为所有有效的XML文档都以<?xml开头,DTD文件似乎缺失了.这就是我得出的结论,即所有DTD文件都是无效的XML文件,但是,XML定义语法本身没有被定义为有效的XML确实令人感到奇怪.为什么? 我正在解析DTD文件以从XML文件删除无效属性,知道要保留哪些属性以及要删除哪些属性,因此我需要一种方法来解析DTD文件. 最终,这只是尝试将HTML转换为ENML(Evernote标记语言)的一步.其中涉及的步骤包括
>将HTML转换为有效的XHTML
>将主体转换为en-note元素
>根据dtd文件删除无效标签属性
>针对dtd验证enml文件

我目前正在考虑从“Understanding the Evernote Markup Language”复制不允许的属性标签,并使用它来验证我的XHTML,但我更喜欢使用DTD作为我的来源.

Nokogiri DTD类是一个Node类,用于保存内联DTD节点并对其进行验证.在我的情况下,我有一个使用SYstem属性指定的外部DTD文件,即Nokogiri does not seem to support.即使它确实有效,我所得到的只是验证.

我确实使用以下方法进行验证:

#dtd = XML::Dtd.new File.read Rails.root.join('lib','assets','enml2.dtd')
#enml_document = XML::Document.string enml
#ret = enml_document.validate dtd

我没有尝试过REXML.我会给你一个回报并报告.

我正在尝试将HTML文档转换为使用给定DTD验证的XML文档. ENML架构中不允许使用大多数HTML元素和属性,因此我必须将其删除删除它们.我还需要知道哪些属性是允许的,哪些不是,这样我就可以正确地解析XML并删除/清理有问题的元素和属性.

为了清理目的,我使用Loofah,但要使用它,我需要一个tag->属性列表(每个标签都有这些属性).我没有进行多次验证文档,而是在清理结束时进行验证,而只是循环遍历每个XML标记并清理它们.但是要知道如何清理它们,我需要知道有效模式中支持哪些标记和元素.因此,我需要解析DTD文件.

根据我的理解,XLST是适合这项工作的工具,但我不习惯使用它.

解决方法

However,it does feel weird to me that the xml deFinition Syntax itself was not defined as valid XML. I’d love to kNow any reasons behind this.

DTD是XML的前身SGML的延续,因此DTD不是XML文件实际上并不奇怪.在创建XML时,保留DTD及其特定语法是一个慎重的决定.

更现代的模式语言,如W3C XML Schema和RELAX NG,确实使用XML语法.

The reason I’m parsing the DTD file is that I want to remove invalid attributes from an XML file. To kNow which attributes to keep and which to remove,I need a way to parse the DTD file. (from question)

I am just looking for a way to parse DTD files,not just validate using them,because I want to perform custom cleanup and validation using the dtd. (from bounty text)

我真的不明白“自定义清理”是什么意思.我也没有看到尝试解析DTD的重点.

为了确定XML文件中的任何元素或属性是否无效(如果它们违反了关联DTD中的规则),您需要使用验证XML解析器来解析XML文件.然后解析器会告诉您是否有任何需要修复的错误.

Nokogiri基于libxml2,它提供了一个验证解析器.它支持使用<!DOCTYPE foo SYstem“bar.dtd”>指定的外部DTD.语法(如何使这项工作显示在您引用的问题的注释中:https://github.com/sparklemotion/nokogiri/issues/440#issuecomment-3031164).

以下是验证的完成方式:

require 'nokogiri'

xml = File.read("yourfile.xml")
options = Nokogiri::XML::ParSEOptions::DTDLOAD   # Needed for the external DTD to be loaded
doc = Nokogiri::XML::Document.parse(xml,nil,options)
puts doc.external_subset.validate(doc)

如果此代码没有输出,则XML文档对DTD有效.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


validates:conclusion,:presence=>true,:inclusion=>{:in=>[0,1]}validates:email,:presence=>true,:length=>{:minimum=>3,:maximum=>254},:uniqueness=>true,:email=>truevalidates:ending_order,
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各Master的状态,如果Master异常,则会做主从切换,将Slave作为master,将master做为slave。其配置也较复杂,且表现一般。redis3.0以后已经支持集群容错功能,并且非常简单1.1素材准备centos7(集群搭建,至少三个master。需
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow                 不知道大家是否注意到,全新安装ruby之后,无论是在windows或是linux还是macosX下使用rix
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 modify_my_object!,这个方法名是以!结尾,在ruby的对象里边是用于表达修改本身的意思。比如String#gsub,返回的是一个新的字符串对象;而String#gsub!,返回的是自身已经被修改的对象。不止!这样的特殊字符可以命名,ruby
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表达方式即编程语言,语言是沟通的介质,而编程语言是程序员与计算机沟通的介质。 什么是编程? 编程即程序员根据需求把自己的思想流程按照某种编程语言的语法风格编写下来,产出的结果就是包含一堆字符的文件。二编程语言分
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编程语言的特性包括:数据封装数据抽象多态性继承这些特性将在面向对象的Ruby中进行讨论。一个面向对象的程序,涉及到的类和对象。类是个别对象创建的蓝图。在面向对象的术语中,您
1.ruby的标签<ruby>漢<rp>(<p><rt>han<t><rp>)<p>字<rp>(<p><rt>zi<t><rp>)<p><uby> 
1、软件安装1.安装包是个压缩包-->解压到/homeedis_tar下命令如下: tar-zxvf./../-C/homeedis_tar2.安装c++环境yum-yinstallgcc-c++(注:redis底层源码是c++)3.解压后需要源码编译进入到redis-3.0.0后执行make4.编译完后开始安装需要指定一个安装路径
1.sass基于Ruby语言开发而成,因此安装sass前需要安装Ruby。(注:mac下自带Ruby无需在安装Ruby!)window下安装SASS首先需要安装Ruby,先从官网下载Ruby并安装。安装过程中请注意勾选AddRubyexecutablestoyourPATH添加到系统环境变量。ruby官网:https:/ubyinstaller.org/downloa
本节对我们项目实现的功能和知识点做一个简单的介绍,因为是RESTfulAPI项目,所以对于后端来说基本上没有什么UI界面可展示,那我们就在关键的点,使用客户端(Android)实现的效果图。课程简介这是一门企业级项目实战课程,目的是从0使用Rails开发一个企业级RESTfulAPI项目;他不能让你年薪30