为给定的XML文件创建XSD的简便方法

时间:2018-02-26 09:37:44

标签: xml

我想编写一个XSD文件来验证以下XML

xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<eventos xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="eventos31.xsd">
<evento tipo="musical">
    <compania>
        <nombre_compania>La Joven Compañia</nombre_compania>
        <interpretes>
            <interprete codint="I1"> Javier   Ariano</interprete>
            <interprete codint="I2"> Alejandro Chaparro</interprete>
            <interprete codint="I3"> Jesús Lavi</interprete>
            <interprete codint="I4"> Rosa Martí</interprete>
            <interprete codint="I5"> Laura Montesinos</interprete>
            <interprete codint="I6"> Maria Romero</interprete>
            <interprete codint="I7"> Ález Villazán</interprete>
            <interprete codint="I8"> Jorge Yumar</interprete>
        </interpretes>
        <director-a> José Luis Arellano García</director-a>
        <web_compania dirweb= "www.lajovencompania.com"/>
    </compania> 
    <nombre_espectaculo>Priscila, reina del desierto</nombre_espectaculo>
    <cuando>
        <fecha dia="22" mes="febrero" anio="2018"/>
        <hora inicio="20:30" fin="23:00"/>
    </cuando>
    <descripcion>Narra las aventuras de tres artistas drag</descripcion>
    <precio>55€</precio>
    <duracion>2h 30min</duracion>
</evento>
<evento tipo="magia">
    <mago>
        <nombre_mago> Jorge Blass</nombre_mago>
        <mail dirmail= "naka@7rojo.com"/>
        <shows>
            <show codshow="C1"> Palabra de Mago</show>
            <show codshow="C2"> Arte de la Magia</show>
            <show codshow="C3"> Birlibirloque</show>
        </shows>
    </mago> 
    <nombre_espectaculo>Palabra de mago</nombre_espectaculo>
    <cuando>
        <fecha dia="02" mes="Junio" anio="2018"/>
        <hora inicio="19:00" fin="20:30"/>
    </cuando>
    <descripcion>Trucos de magia de Jorge Blas</descripcion>
    <precio>18€</precio>
    <duracion>1h 30min</duracion>
</evento>
<evento tipo="humor">
    <comico>
        <nombre_comico> Dani Mateo</nombre_comico>
        <ciudad> Granollers</ciudad>
        <edad> 38</edad>
        <redes_sociales>
            <blog> danimateo.blogspot.com</blog>
            <twitter> @DaniMateoAgain</twitter>
            <facebook> @dani.mateo</facebook>
        </redes_sociales>
    </comico>   
    <nombre_espectaculo>Dani Mateo,10 aniversario</nombre_espectaculo>
    <cuando>
        <fecha dia="09" mes="Junio" anio="2018"/>
        <hora inicio="20:30" fin="22:00"/>
    </cuando>
    <precio>21€</precio>
    <duracion>1h 30min</duracion>
</evento>

这就是我到目前为止所尝试的内容

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="eventos">
    <xs:complexType>
    <xs:sequence>
    <xs:element name="evento" maxOccurs="unbounded">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="compania">
                <xs:complexType>
                    <xs:sequence>
                    <xs:element name="nombre_compania" type="xs:string" />
                    <xs:element name="interpretes">
                        <xs:complexType>
                        <xs:sequence>
                            <xs:element name="interprete" maxOccurs="unbounded"/>   
                        </xs:sequence>
                            <xs:attribute name="codint" type="xs:string" use="required"/>
                        </xs:complexType>
                    </xs:element>   
                    <xs:element name="director-a" type="xs:string" />
                    <xs:element name="web_compania"/>   
                    </xs:sequence>
                    <xs:attribute name="dirweb" type="xs:string"/>
                </xs:complexType>
            </xs:element>   
            <xs:element name="nombre_espectaculo" type="xs:string" maxOccurs="unbounded"/>  
            <xs:element name="cuando">
                        <xs:complexType>
                            <xs:sequence>
                            <xs:element name="fecha"/>
                            <xs:element name="hora"/>
                            </xs:sequence>
                            <xs:attribute name="dia" type="xs:integer"/>
                            <xs:attribute name="mes" type="xs:string"/>
                            <xs:attribute name="anio" type="xs:integer"/>
                            <xs:attribute name="inicio" type="xs:string"/>
                            <xs:attribute name="fin" type="xs:string"/>
                        </xs:complexType>
            </xs:element>   
            <xs:element name="descripcion" type="xs:string"/>
            <xs:element name="precio" type="xs:string"/>
            <xs:element name="duracion" type="xs:string"/>
            <xs:element name="mago" minOccurs="0">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="nombre_mago" type="xs:string"/>
                        <xs:element name="mail"/>   
                        <xs:element name="shows">
                            <xs:complexType>
                            <xs:sequence>
                            <xs:element name="show" type="xs:string"/>  
                            </xs:sequence>
                            <xs:attribute name="codshow" type="xs:string" use="required"/>
                            </xs:complexType>
                        </xs:element>   
                    </xs:sequence>
                    <xs:attribute name="dirmail" type="xs:string"/>
                </xs:complexType>
            </xs:element>
            <xs:element name="comico" minOccurs="0">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="nombre_comico" type="xs:string"/>
                        <xs:element name="ciudad" type="xs:string"/>
                        <xs:element name="edad" type="xs:integer"/>
                        <xs:element name="redes_sociales">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="blog" type="xs:string"/>
                                    <xs:element name="twitter" type="xs:string"/>
                                    <xs:element name="facebook" type="xs:string"/>
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>   
                    </xs:sequence>
                </xs:complexType>
            </xs:element>   
        </xs:sequence>
        <xs:attribute name="tipo" type="xs:string"/>
    </xs:complexType>   
    </xs:element>
    </xs:sequence>
    </xs:complexType>   
</xs:element>   

使用xmllint xmllint -schema eventos31.xsd 48985313.xml

我得到了

48985313.xml:6: element interpretes: Schemas validity error : Element 'interpretes': The attribute 'codint' is required but missing.
48985313.xml:29: element mago: Schemas validity error : Element 'mago': This element is not expected. Expected is ( compania ).
48985313.xml:48: element comico: Schemas validity error : Element 'comico': This element is not expected. Expected is ( compania ).
48985313.xml fails to validate

为现有XML文件获取XSD的最简单方法是什么?

1 个答案:

答案 0 :(得分:0)

将文档加载到 Eclipse 并安装“ Eclipse Xml编辑器和工具”我可以看到您的xml文档中存在各种错误。您应该逐行检查错误,并在XSD或XML文件中询问自己在哪里纠正错误。

  1. 第6行: cvc-complex-type.4:属性'codint'必须出现在元素'interpretes'上。

      

    这可以通过在&lt; interpretes&gt;中添加codint属性来解决。 XML文件中的标记。我也可以修改相应的XSD定义。

  2. 第29行: cvc-complex-type.2.4.a:找到以元素'mago'开头的无效内容。 '{compania}'之一是 预期

      

    ...继续...尝试理解错误...尝试修复XSD或XML ...如果什么都不起作用,请问堆栈溢出问题

  3. 第32行 cvc-type.3.1.1:元素'show'是一个简单类型,因此它不能具有属性,除了那些 命名空间名称与“http://www.w3.org/2001/XMLSchema-instance”相同,其[本地名称] 是'type','nil','schemaLocation'或'noNamespaceSchemaLocation'之一。但是,属性, 'codshow'被发现了。
  4. 第33行元素'show'是一个简单类型,因此它不具备属性...
  5. 第34行元素'show'是一个简单的类型,所以它不能有属性......
  6. 第35行元素'show'是一个简单的类型,所以它不能有属性......
  7. 第48行:从元素'comico'开始发现无效内容。 '{compania}'之一是 预期。