在XML中创建复杂类型的序列,并根据模式

时间:2017-06-09 11:40:49

标签: xml xsd

如何编写复杂类型中序列一部分的各种重复元素?

我有以下架构:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
  <xs:element name="Measurements">
    <xs:annotation>
      <xs:documentation>Schema for Measurements data transmission</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element name="m_doc" type="xs:string"/>
        <xs:element name="m_parameters">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="m_name" type="xs:string"/>
              <xs:element name="m_isEngValue" type="xs:boolean"/>
              <xs:element name="m_unit" type="xs:string"/>
              <xs:element name="m_radix" type="xs:string"/>
              <xs:element name="m_value" type="xs:string"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

我针对之前的架构测试了以下XML:

<?xml version="1.0" encoding="UTF-8"?>
<Measurements xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
    <m_doc>TestDoc</m_doc>
    <m_parameters>

      <!-- First group -->
      <m_name>Length</m_name>
      <m_isEngValue>false</m_isEngValue>
      <m_unit></m_unit>
      <m_radix>HEXADECIMAL</m_radix>
      <m_value>0</m_value>

      <!-- Second group -->
      <m_name>Height</m_name>
      <m_isEngValue>false</m_isEngValue>
      <m_unit></m_unit>
      <m_radix>DECIMAL</m_radix>
      <m_value>0</m_value>

    </m_parameters>
</Measurements>

出现此错误:

  

Cvc-complex-type.2.4.d:找到无效的内容   元素'm_name'。在这一点上没有预期的儿童元素。,线   '13',列'15'。

此错误是关于构成参数的第二组5个元素。如果我删除了第二组,那么我没有错误。

我正在尝试使用在线验证器:www.freeformatter.com

架构是我无法控制的要求。我必须生成XML,它将通过该模式进行验证。

1 个答案:

答案 0 :(得分:2)

通常的做法是将每个组包装成一个无限制的元素:

<?xml version="1.0" encoding="UTF-8"?>
<Measurements xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
  <m_doc>TestDoc</m_doc>
  <m_parameters>
    <!-- First group -->
    <m_parameter>
      <m_name>Length</m_name>
      <m_isEngValue>false</m_isEngValue>
      <m_unit></m_unit>
      <m_radix>HEXADECIMAL</m_radix>
      <m_value>0</m_value>
    </m_parameter>
  <!-- Second group -->
    <m_parameter>
      <m_name>Height</m_name>
      <m_isEngValue>false</m_isEngValue>
      <m_unit></m_unit>
      <m_radix>DECIMAL</m_radix>
      <m_value>0</m_value>
    </m_parameter>
  </m_parameters>
</Measurements>

表示架构:

<xs:element name="m_parameters">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="m_parameter" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="m_name" type="xs:string"/>
            <xs:element name="m_isEngValue" type="xs:boolean"/>
            <xs:element name="m_unit" type="xs:string"/>
            <xs:element name="m_radix" type="xs:string"/>
            <xs:element name="m_value" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

如果您无法控制架构,我担心重复是不可能的,因为minOccursmaxOccurs默认值为1。