xml - xsd 文件:不能有同名的元素序列
问题描述
我想将一个 Excel 文件导出为 XML,如下所示:
<Data form="DTA_CAL">
<Item>
<Dim prop="SII_TAX_COL">010</Dim>
<Dim prop="SII_TAX_DEC">1010.15</Dim>
<Dim prop="SII_TAX_RUB">010</Dim>
</Item>
<Item>
<Dim prop="SII_TAX_COL">010</Dim>
<Dim prop="SII_TAX_DEC">2010</Dim>
<Dim prop="SII_TAX_RUB">020</Dim>
</Item>
</Data>
但是我无法拥有一个正确的 xsd 来允许具有相同名称的元素序列,我尝试了这个:
<xs:element name="Data">
<xs:complexType>
<xs:sequence>
<xs:element name="Item" maxOccurs="3">
<xs:complexType>
<xs:all>
<xs:element name="Dim" >
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="prop" type="xs:string" fixed="SII_TAX_COL">
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="Dim">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="prop" type="xs:string" fixed="SII_TAX_DEC">
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="Dim">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="prop" type="xs:string" fixed="SII_TAX_RUB" >
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
但是当我上传这个 XSD 文件时出现错误,我不能在一个序列中的 3 个元素中使用相同的名称“Dim”。
我怎样才能有 XSD 来描述这个 XML?
解决方案
您不能定义三个具有相同名称的元素。您只能定义一个元素并使用 和 限制其minOccurs
出现maxOccurs
。您可以将属性值限制为一个序列。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="Data">
<xs:complexType>
<xs:sequence>
<xs:element name="Item" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Dim" minOccurs="3" maxOccurs="3">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="prop" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="SII_TAX_COL"/>
<xs:enumeration value="SII_TAX_DEC"/>
<xs:enumeration value="SII_TAX_RUB"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="form" type="xs:string" use="required" fixed="DTA_CAL"/>
</xs:complexType>
</xs:element>
</xs:schema>
但以上并不能保证属性值是唯一的。如果您希望它们是唯一的,则必须添加唯一约束。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="Data">
<xs:complexType>
<xs:sequence>
<xs:element name="Item" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Dim" minOccurs="3" maxOccurs="3">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="prop" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="SII_TAX_COL"/>
<xs:enumeration value="SII_TAX_DEC"/>
<xs:enumeration value="SII_TAX_RUB"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:unique name="Dim_prop">
<xs:selector xpath="Dim"/>
<xs:field xpath="@prop"/>
</xs:unique>
</xs:element>
</xs:sequence>
<xs:attribute name="form" type="xs:string" use="required" fixed="DTA_CAL"/>
</xs:complexType>
</xs:element>
</xs:schema>
如果您以这种方式组织 XML,则处理会更容易:
<Data form="DTA_CAL">
<Item>
<Dim SII_TAX_COL="010" SII_TAX_DEC="1010.15" SII_TAX_RUB="010"/>
</Item>
</Data>
推荐阅读
- function - C++11 特化一个版本的可变参数函数
- php - 如何使用父 $table 属性从父类的子类运行 Eloquent create()?
- python - 为什么需要静态方法装饰器?
- python - 像 Excel 数据透视表一样可视化 pandas 数据框
- sql - 创建表时如何在 SQL 中格式化当前日期和时间,但只包含时间本身?
- angular - 我可以在 PrimeNG p-dropdown 中编辑背景吗?
- gcc - 如何修复:/bin/ld:找不到 -lgfortran 错误:ld 返回 1 退出状态
- c++ - C++ 编程从外部文本文件定义数组大小
- php - PuPHPet 错误:安装 php7.0-mysqlnd' 返回 100
- react-native - 对象作为 React 子对象无效(找到:带键的对象..)