Альтернативный или необязательный тег в XSD

#java #xml #xml-parsing #xsd

#java #xml #синтаксический анализ xml #xsd

Вопрос:

У меня есть xsd для структуры проверки XML, которая может отображаться с двумя типами одного и того же тега. поэтому я должен обработать эти оба сценария в моем xsd. Я искал и нашел альтернативный тег и тег выбора для выполнения моего требования, но не смог вставить в надлежащем формате:

ниже приведен тип тега:

Либо

 <funcs>
<joint>
<functionName value=""/>
<indataType value=""/>
</joint>
</funcs>
  

или

 <funcs path="myinfo.txt"/>
  

когда я вставляю альтернативный тег, обнаружено следующее исключение:

 Exception: s4s-elt-must-match.1: The content of 'funcs' must match (annotation?, (simpleType | complexType)?, (unique | key | keyref)*)). A problem was found starting at: alternative.
  

Комментарии:

1. Можете ли вы опубликовать свой XSD?

Ответ №1:

Мой ответ поможет вам, если в ваших случаях возможно назвать тег ‘funcs’ по-другому.

Вы могли бы использовать этот XSD:

 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xsd:element name="root">
        <xsd:complexType>
            <xsd:choice>
                <xsd:element ref="funcs_1"/>
                <xsd:element name="funcs_2" type="f2"/>
            </xsd:choice>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="funcs_1">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="joint" type="f1" maxOccurs="1" minOccurs="1"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:complexType name="f1">
        <xsd:sequence>
            <xsd:element name="functionName" type="f3">
            </xsd:element>
            <xsd:element name="indataType" type="f3">
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="f3">
        <xsd:attribute name="value" type="xsd:string" use="required"/>
    </xsd:complexType>
    <xsd:complexType name="f2">
        <xsd:attribute name="path" type="xsd:string" use="required"/>
    </xsd:complexType>
</xsd:schema>
  

Для проверки этих двух XML,

XML1:

 <root>
    <funcs_1>
        <joint>
            <functionName value=""/>
            <indataType value=""/>
        </joint>
    </funcs_1>
</root>
  

XML2:

 <root>
    <funcs_2 path="myinfo.txt"/>
</root>