代码之家  ›  专栏  ›  技术社区  ›  zzzeek

需要关于xml模式“all”标记的说明(这是libxml2错误吗?)

  •  3
  • zzzeek  · 技术社区  · 16 年前

    从libxml2.6升级到2.7时,我的一些行为发生了变化。我在他们的网站上找到了关于这个变化的bug报告,它是 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.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
    
    2 回复  |  直到 16 年前
        1
  •  5
  •   jasso    16 年前

    你要做什么 minOccurs 和 maxOccurs <xs:all> 要素

    <xs:all> <xs:element> 默认值为“1” 小发生 和 . 因此

    <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>
    

    <

    <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/> 元素。我明白了这就是spec的真正含义,“组中的所有元素可能只出现一次,也可能根本不出现”。我不是一个以英语为母语的人,但是我也要说w3schools页面上的第二个例子是不正确的。应该是这样的 二者都 元素可以出现零次或一次“代替” 每个

    最大发生次数 <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>
    

    <起源xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://www.example.com/xml/schemas“>
    <内部属性>12</内部属性>
    

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

        2
  •  1
  •   Jörn Horstmann    16 年前

    有趣的问题是,我认为libxml行为在这种情况下是正确的。注意,xsd规范中的引用

    后面是一个示例,其中一个包含的元素具有 minOccurs="0"