草庐IT

xml - 需要澄清有关 xml 模式 "all"标记(这是 libxml2 错误吗?)

coder 2024-06-29 原文

从 libxml2 2.6 升级到 2.7 时,我的一些行为发生了变化。我在他们的网站上找到了关于此更改的错误报告,它是 https://bugzilla.gnome.org/show_bug.cgi?id=571271 .

有趣的是,他们报告说“我猜我们误解了这个选项的预期行为 (虽然我仍然不是 100% 确定)”——他们不确定他们是否正确阅读了规范,但他们提交了修复。

我认为前面的行为是正确的,所以我想看看这里有没有人在这两个方向上有知识。

基本上,<xs:all>elem1, elem2, ..<xs:all>意思是“elem1,elem2 .. 全部或全部都必须存在”,或“elem1,elem2 ..中的任何一个都可能存在”?尽管看起来像前者,但有两个消息来源并没有说明这一点:

http://www.w3.org/TR/xmlschema-0/#ref18 - "组中的所有元素可能出现一次或根本不出现,并且它们可能以任何顺序出现。"

http://www.w3schools.com/Schema/el_all.asp - “上面的示例表明“名字”和“姓氏”元素可以以任何顺序出现,并且每个元素可以出现零次或一次!”

以下脚本使用 lxml,在使用 libxml2 2.6 时报告成功,但在 2.7 上第二次模式验证失败。有人可以确认 2.7 在这里做的是对还是错?

from lxml import etree
from StringIO import StringIO

schema = """
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:element type="parent-type" name="parent"/>
 <xs:complexType name="parent-type">
   <xs:all maxOccurs="1" minOccurs="0">
     <xs:element type="xs:int" name="int-attr"/>
     <xs:element type="xs:string" name="str-attr"/>
   </xs:all>
 </xs:complexType>
</xs:schema>
"""

xmlschema = etree.XMLSchema(etree.parse(StringIO(schema)))

# passes
doc1 = """
<parent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.example.com/xml/schemas">
 <str-attr>some value</str-attr>
 <int-attr>12</int-attr>
</parent>
"""

# fails.  it wants both "int-attr" and "str-attr" to be present.
# didn't think this was how "xs:all" worked ?
doc2 = """
<parent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.example.com/xml/schemas">
 <int-attr>12</int-attr>
</parent>
"""

for i, doc in enumerate((doc1, doc2, )):
   doc = etree.parse(StringIO(doc))
   try:
       xmlschema.assertValid(doc)
       print "document %d is valid." % i
   except Exception, e:
       print "document %d is not valid." % i
       print e

输出:

document 0 is valid.
document 1 is not valid.
Element 'parent': Missing child element(s). Expected is ( str-attr )., line 2

最佳答案

用户 Jörn Horstmann 实际上已经正确回答了您的问题,但格式可能会使答案看起来有点不清楚。我希望这些示例可以帮助那些感到困惑的人。

做什么minOccursmaxOccurs意思是 <xs:all>元素

记住 <xs:all><xs:element> minOccurs 的默认值为“1”和 maxOccurs .因此

<xs:all>
  <xs:element type="xs:int" name="int-attr"/>
  <xs:element type="xs:string" name="str-attr"/>
</xs:all>

其实和

是一样的
<xs:all minOccurs="1" maxOccurs="1">
  <xs:element type="xs:int" name="int-attr" minOccurs="1" maxOccurs="1"/>
  <xs:element type="xs:string" name="str-attr" minOccurs="1" maxOccurs="1"/>
</xs:all>

这意味着整个<xs:all> group 以及其中定义的两个元素都是强制性的 - 顺序是免费的。因此 XML 文档

<parent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="http://www.example.com/xml/schemas">
  <int-attr>12</int-attr>
</parent>

将无效。使用属性 minOccurs="0"<xs:all>意味着整个组是可选的,在这种情况下它也允许一个空的 <parent/>元素。我看到这就是规范“组中的所有元素可能出现一次或根本不出现”的真正含义。我的母语不是英语,但我还要说 w3schools 页面上的第二个示例不正确。它应该读作“两个元素可以出现零次或一次”而不是“每个元素可以出现零次或一次”。

maxOccurs <xs:all> 的属性是fixed to value "1" .

如何定义具有零个或一个子标签的标签

这就是您在评论中提出的问题以及您首先尝试验证的内容。 <xs:all> 中的可选元素组是通过添加属性 minOccurs="0" 来实现的在那些元素上。下面的例子

<xs:all minOccurs="1" maxOccurs="1">
  <xs:element type="xs:int" name="int-attr" minOccurs="0" maxOccurs="1"/>
  <xs:element type="xs:string" name="str-attr" minOccurs="0" maxOccurs="1"/>
</xs:all>

此模式将验证 XML 文档

<parent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="http://www.example.com/xml/schemas">
  <int-attr>12</int-attr>
</parent>

因为这两个元素都是可选的(因为它们有 minOccurs="0" )这个定义也允许一个空的 <parent/>元素。尽管对元素的基数限制在某种程度上“覆盖”了 <xs:all> 上的设置该规范还说:“内容模型中的任何元素都不能出现多次,即 minOccurs 和 maxOccurs 的允许值为 0 和 1”。所以你不能有一个以随机顺序多次具有相同元素的组,或者至少你不能使用 <xs:all>创建这样的类型。

关于xml - 需要澄清有关 xml 模式 "all"标记(这是 libxml2 错误吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3196806/

有关xml - 需要澄清有关 xml 模式 "all"标记(这是 libxml2 错误吗?)的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  3. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  4. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  5. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  6. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用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

  7. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  8. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  9. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  10. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

随机推荐