奇怪的XML模式
好的,我的任务是从供应商提供给我们的XML文档中编写XSD。这个供应商没有他们可以提供的XSD,所以我是逆向工程。以下是此xml的形成方式示例:奇怪的XML模式,xml,xsd,schema,Xml,Xsd,Schema,好的,我的任务是从供应商提供给我们的XML文档中编写XSD。这个供应商没有他们可以提供的XSD,所以我是逆向工程。以下是此xml的形成方式示例: <field name="id">1</field> <field name="Sport">Football</field> <field name="Position">Quarterback</field> <field name="Touchdowns">7&l
<field name="id">1</field>
<field name="Sport">Football</field>
<field name="Position">Quarterback</field>
<field name="Touchdowns">7</field>
<field name="Interceptions">2</field>
<field name="Yardage">2000</field>
1
足球
四分卫
7.
2.
2000
因此,由于所有元素都被命名为“field”,因此我在为此创建模式时遇到了困难。这就是我到目前为止所做的:
<xs:element name="field" type="xs:int">
<xs:simpletype>
<xs:attribute name="name" type="xs:string" default="id"/>
</xs:string>
</xs:element>
我遇到的问题是,所有元素都将具有相同的名称。我用来编写xsd的软件有问题。我有正确的方法吗
感谢您的帮助。您基本上拥有一个类型,它是您以不同方式扩展的基本元素。如果代码有点错误,请原谅,我没有尝试验证模式,我是从内存中编写的,这不是编写模式的好方法,但你应该明白
<xsd:complexType name="field">
<xsd:simpleContent>
<xsd:extension>
<xsd:attribute name="name" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
使用属性名称定义基本元素(对属性类型没有约束)。这将验证原始帖子中的所有示例
然后您可以尝试扩展:
<xsd:complexType name="idField">
<xsd:complexContent>
<xsd:extension base="field">
...restrict it in here
</xsd:extension>
<xsd:complexContent>
</xsd:complexType>
…把它限制在这里
对每个变体都做类似的操作,基本上使它们成为主定义的子类型
我意识到这个“答案”并不能给出一个明确的答案,但希望它能把你推向正确的方向
如果做不到这一点,我看不出除了让供应商重写他们的XML之外还能做什么。您的
字段的maxOccurs
元素的默认值是1(因此请尝试将其设置为无界)。此外,simpleType
可能不包含属性或子元素
我相信下面的例子是有效的:
XSD:
XML:
1.
足球
四分卫
7.
2.
2000
我在name
类型中使用了xs:string,但是我想您可以定义一个新的数据类型来强制执行某些关键字…字段元素不应该是string类型吗?不,因为第一个元素的实际内容是id,它是int.Sry-应该更具描述性-示例xsd只包含第一个元素(id字段)事实上,我刚刚意识到可能有一种方法,在我编辑的时候别挂断,该死的我打字太快,思维太慢……是的,所以编辑提出了一种方法来扩展基本字段类型以匹配不同的专业,但我不完全确定它到底有多准确/有效。我认为,尽管有这样一个通用模式是有效的,但它并不是有效的除了实例XML文件的正式定义之外,还可以添加很多内容。但是,这可能是创建有效架构的最简单方法(+1)
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="fields">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="field"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="field">
<xs:complexType>
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
<?xml version="1.0" ?>
<fields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="fields.xsd">
<field name="id">1</field>
<field name="Sport">Football</field>
<field name="Position">Quarterback</field>
<field name="Touchdowns">7</field>
<field name="Interceptions">2</field>
<field name="Yardage">2000</field>
</fields>