这个问题已经有了答案:
Is there any difference between 'valid xml' and 'well formed xml'?
14答
I made a claim that an unescaped ampersand in some XML source was "invalid XML"LarsH然后提到:
从技术上讲,XML“格式不好”。“无效”意味着它无法符合特定的架构。
我试图找到“无效”xml和“格式不好”xml的官方定义来证实larsh的说法,但在官方规范中找不到任何定义可供比较。
“无效”XML与“格式不正确”XML有何不同?
最佳答案
我认为总的区别很明显,内森和肖恩的答案是准确的。引起这个问题的不清楚的角落案例是:
如果文件格式不正确,它是否有效?它会无效吗?
我从长期使用xml得到的印象是,对于一个非良好格式的xml片段,有效性问题是未定义的。但我无法从XML规范中证明这一点。
理论上
XML规范中的official definition of "valid"是:
定义:如果XML文档有关联的文档,则该文档有效
类型声明以及文档是否符合约束
表达在里面。
注意,这个定义以“xml文档”开头。XML document is defined as
定义:如果数据对象是格式良好的XML文档,则它是
在本规范中定义。另外,xml文档是有效的
如果它满足某些进一步的限制。
这意味着上述“有效”的定义仅适用于xml文档,即格式良好的数据对象。对于不是(格式良好的)xml文档的数据对象,“valid”的定义没有任何说明。
各种解释学问题仍然存在…
我们是否认为上述有效的定义是详尽无遗的…也就是说,我们是否假设没有其他关于有效性的文字是确定的?(如果是,则忽略基于xml模式或relaxng等的in/validity)
我们把“如果”当作“只有如果”吗?例如,一个格式良好、没有DTD的XML文档也可以被认为是有效的吗?如果一个格式不好的XML文档符合其关联的DTD,那么它是否可以被认为是有效的?(bob ducharmesseems to say这个定义的意思是“only if”:“xml规范明确指出有效文档必须是格式良好的[emphasis mine]。”)
我们能假定每个不“有效”的XML文档都是“无效”的吗?我认为是这样。但是每个数据对象呢?是否存在未定义的有效性状态?XML规范从不定义“无效”一词,为解释留下了余地。很明显,如果x是无效的,那么它是无效的。但反过来说:如果x是无效的,这是否意味着它必须是无效的?
看看XML方面受人尊敬的专家,在规范之外…
bob ducharmewrites一个无效的xml文档…可能仍然格式良好…,这意味着无效的XML文档可能格式不正确。但再说一遍,“无效”和“无效”是同一回事吗?而且,according to the spec,根据定义,xml文档格式良好。因此,从技术上讲,一个无效的xml文档仍然必须是格式良好的。我相信杜查姆在这里使用的术语有些松散。
我们还需要记住sgml派生语言的更广泛的上下文,包括html。This web page给出了xhtml页面的示例,它说根据w3c验证程序服务,xhtml页面是有效的,但是格式不好。然而,当我run them by the validator service时,它并不表示它们是有效的。
在实践中
实际上,任何验证引擎都很难处理任何格式不好的xml。它必须首先“更正”输入数据,猜测预期的、正确的XML结构应该是什么,并且没有该过程的官方规范。因此,实现之间的结果可能会有很大差异。验证将依赖于实现。
结论
出于这个原因,我想说,出于所有实际目的,如果一个数据对象不是一个(格式良好的)xml文档,那么声称它是无效的xml是误导性的。如果您要传达(如the case of the unescaped ampersand中所述)数据不是格式良好的xml,那么术语“invalid”传达的是错误的信息,即使可以说可以认为是正确的。这有点像说蜘蛛不是果蝇,因为它有六条腿以上,而你的意思是蜘蛛不是昆虫,因为它有六条腿以上。的确,蜘蛛不是果蝇,但它的意思并没有被传达出来。
然而,我看不到来自XML规范的一个铁证如山的参数,它说明一个格式不好的XML数据对象是否可能(或者必须)无效。如果我们遵循bob ducharme(我们可能应该这样做),我们可以安全地得出结论,格式不正确的xml数据对象是无效的。
当然,如果我们说,引用的数据对象不是格式良好的XML,它是无效的,我们会引起混淆,我们可能很容易被理解为声称它不是格式良好的。
我希望进一步阅读有关xml的专家可以让我们更好地了解关于这个问题的共识,即使答案没有xml规范那么正式。
关于xml - “格式不正确的” XML和“无效”的XML有什么区别? ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16324243/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串