我的任务是编写一个xml文档的解析器,其支持架构是由人们创建的,比我更智能,更有经验。我不是xml专家,但是,据我所知,我相信有其架构中缺少一些注意事项。
这是我给出的架构的简化版本:
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xsd:attributeGroup name="Group1">
<xsd:attribute name="attrib1" type="xsd:NMTOKENS"/>
<xsd:attribute name="attrib2" type="xsd:NMTOKENS"/>
</xsd:attributeGroup>
</xsd:schema>
在我回到我的客户并批评他们的架构设计之前,我真的很感激集体stackoverflow智能来确认或否认以下内容:
attributeGroup中的属性只能在有效xml文档的单个元素中出现一次。例如:
<?xml version="1.0"?>
<element1 attrib1="first second third" attrib1="first second third"/>
无效,因为有'attrib1'重复,对吗?
提前感谢您的意见。
答案 0 :(得分:1)
应该使用attributeGroup 模式中的某种元素。 只有一个没有意义 attributeGroup独自站在一个 架构。
嗯,这取决于它是否有意义。在XML中,属性类似于“附加到元素的额外信息”。因此,在实例文档中,如果没有“托管”它的元素,则不能存在属性。要在实例文档中具有属性,需要1)存在具有此属性的元素2)该属性以某种方式在模式中定义或引用。如果架构中没有任何元素被定义(允许)使用某个属性,则该属性不能出现在实例文档中。
然后,再次允许定义未使用的属性,这不是错误。在某些情况下,这可能是合理的,例如,为了简化未来计划的功能的采用,或允许将模式导入或包含到另一个可以利用这些属性的模式中。
attributeGroup中的属性 只能在有效期内发生一次 xml文档。例如:
<?xml version="1.0"?> <element1 attrib1="first second third" attrib1="first second third"/>
无效,因为有一个 复制'attrib1',对吗?
您的代码示例很明确:XML中不允许这样做。作为stated in the XML recommendation:“属性名称不得在同一个开始标记或空元素标记中出现多次。”然后,您在代码示例上面写的声明并不完全正确。有效的XML文档中可能会出现多次相同的属性。它只需要出现在不同的元素上。在一个元素上复制属性不允许。但是,您可以复制元素,使它们都具有相同的属性。
不允许:
<element1 attrib1="first second third" attrib1="first second third"/>
允许:
<element1 attrib1="first second third"/>
<element1 attrib1="first second third"/>
作为一个极端情况,重复的属性名称适用于属性的扩展名称。
<element ns1:attrib="value" ns2:attrib="value"/>
如果前缀ns1
和ns2
都解析为相同的名称空间URI,则不允许。