Pergunta

O que elementFormDefault fazer, e quando ele deve ser usado?

Então, eu encontrei algumas definições para valores elementFormDefault:

qualificados - elementos e atributos estão na targetNamespace do esquema

não qualificada - elementos e atributos não tem um namespace

Assim, a partir dessa definição que eu poderia pensar que se um esquema é definido para qualificado, então por que você deve prefixar o tipo com o namespace? E quais são os cenários que você teria sequer um conjunto para não qualificado para esse assunto? Eu tentei Googling, mas tudo que eu consegui foram algumas páginas do W3C que eram extremamente difíceis de entender.

Este é o arquivo que eu estou trabalhando com agora, por que eu preciso para declarar o tipo target:TypeAssignments quando eu declarar a targetNamespace como o mesmo que xmlns:target?

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:target="http://www.levijackson.net/web340/ns"
        targetNamespace="http://www.levijackson.net/web340/ns" 
        elementFormDefault="qualified">
  <element name="assignments">
    <complexType>
      <sequence>
        <element name="assignments" type="target:TypeAssignments"
                 minOccurs="1" maxOccurs="unbounded"/>
      </sequence>
    </complexType>
  </element>
  <complexType name="TypeAssignments">
    <sequence>
      <element name="assignment" type="target:assignmentInfo"
               minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
  </complexType>
  <complexType name="assignmentInfo">
    <sequence>
      <element name="name" type="string"/>
      <element name="page" type="target:TypePage"/>
      <element name="file" type="target:TypeFile" 
               minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
    <attribute name="id" type="string" use="required"/>
  </complexType>
  <simpleType name="TypePage">
    <restriction base="integer">
      <minInclusive value="50" />
      <maxInclusive value="498" />
    </restriction>
  </simpleType>
  <simpleType name="TypeFile">
    <restriction base="string">
      <enumeration value=".xml" />
      <enumeration value=".dtd" />
      <enumeration value=".xsd" />
    </restriction>
  </simpleType>
</schema>
Foi útil?

Solução

elementFormDefault não tem nada a ver com namespace dos tipos no esquema, é sobre os espaços de nomes dos elementos em documentos XML que estejam em conformidade com o esquema.

Aqui está a seção relevent da especificação:

Element Declaration Schema

Component Property  {target namespace}
Representation      If form is present and its ·actual value· is qualified, 
                    or if form is absent and the ·actual value· of 
                    elementFormDefault on the <schema> ancestor is qualified, 
                    then the ·actual value· of the targetNamespace [attribute]
                    of the parent <schema> element information item, or 
                    ·absent· if there is none, otherwise ·absent·.

O que isto significa é que o targetNamespace você declarou no topo do esquema só se aplica aos elementos no documento XML compatível esquema se quer elementFormDefault é "qualificado" ou o elemento é declarado explicitamente no esquema como tendo forma = "qualificado".

Por exemplo: Se elementFormDefault é inqualificável -

<element name="name" type="string" form="qualified"></element>
<element name="page" type="target:TypePage"></element>

colocará esperar elementos "Nome" para estar na targetNamespace e elementos de "página" de estar no namespace nulo.

Para evitar que tenha que pôr o formulário = "qualificado" em cada declaração de elemento, afirmando meios "qualificados" que o targetNamespace se aplica a cada elemento a menos que substituída, colocando forma = "desqualificado" na declaração de elemento elementFormDefault =.

Outras dicas

Considere o seguinte AuthorType ComplexType usado por elemento author

<xsd:complexType name="AuthorType">
  <!-- compositor goes here -->
  <xsd:sequence>
     <xsd:element name="name" type="xsd:string"/>
     <xsd:element name="phone" type="tns:Phone"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="tns:AuthorId"/>
</xsd:complexType>
<xsd:element name="author" type="tns:AuthorType"/>

Se elementFormDefault="unqualified"

então seguinte XML Instância é válido

<x:author xmlns:x="http://example.org/publishing">
   <name>Aaron Skonnard</name>
   <phone>(801)390-4552</phone>
</x:author>

atributo O nome do autor é permitida sem especificar o namespace (não qualificado). Quaisquer elementos que fazem parte da <xsd:complexType> são considerados como local para complexType.

Se elementFormDefault="qualified"

, em seguida, a instância deve ter os elementos locais qualificado

<x:author xmlns:x="http://example.org/publishing">
   <x:name>Aaron Skonnard</name>
   <x:phone>(801)390-4552</phone>
</x:author>

este link para mais detalhes

New, resposta e explicação detalhada para uma velha questão, perguntas mais frequentes ...

Resposta curta :. Se você não adicionar elementFormDefault="qualified" para xsd:schema, elementos, em seguida, os meios de valor unqualified padrão que declararam localmente estão em não namespace

Há muita confusão sobre o que elementFormDefault faz, mas isso pode ser rapidamente esclarecido com um pequeno exemplo ...

simplificada versão do seu XSD:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:target="http://www.levijackson.net/web340/ns"
        targetNamespace="http://www.levijackson.net/web340/ns">
  <element name="assignments">
    <complexType>
      <sequence>
        <element name="assignment" type="target:assignmentInfo" 
                 minOccurs="1" maxOccurs="unbounded"/>
      </sequence>
    </complexType>
  </element>
  <complexType name="assignmentInfo">
    <sequence>
      <element name="name" type="string"/>
    </sequence>
    <attribute name="id" type="string" use="required"/>
  </complexType>
</schema>

Pontos principais:

  • O elemento assignment for definido localmente.
  • Elementos localmente definido no XSD não são de namespace por padrão.
    • Isto porque o valor padrão para elementFormDefault é unqualified.
    • Este sem dúvida é um erro de design pelos criadores de XSD.
    • A prática padrão é usar sempre elementFormDefault="qualified" de modo que assignment está no namespace de destino como seria esperar.

XML Aparentemente válido

Este XML parece que deve ser válido de acordo com o acima XSD:

<assignments xmlns="http://www.levijackson.net/web340/ns"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.levijackson.net/web340/ns try.xsd">
  <assignment id="a1">
    <name>John</name>
  </assignment>
</assignments>

Aviso:

  • O namespace padrão em lugares assignments assignments e todos os seus descendentes no namespace padrão (http://www.levijackson.net/web340/ns).

perplexos Erro de validação

Apesar da aparência válido, o XML acima produz o erro de validação seguinte confundindo:

[erro] try.xml: 4: 23: CVC-complexo-type.2.4.a: conteúdo inválido foi encontrado começando com elemento 'atribuição'. Um dos '{atribuição}' é esperado.

Notas:

  • Você não seria o primeiro desenvolvedor para amaldiçoar esse diagnóstico que parece dizer que o conteúdo é inválido porque esperava encontrar um elemento assignment mas realmente encontrado um elemento assignment. ( WTF )
  • O que isso realmente significa: A { e } torno meios assignment que a validação estava esperando assignment em nenhum namespace aqui. Infelizmente, quando se diz que encontrou um elemento assignment, ele não menciona que ele encontrou em um namespace padrão que difere de nenhum namespace.

Solução

  • A grande maioria do tempo: Adicionar elementFormDefault="qualified" ao elemento xsd:schema do XSD. Isto significa XML deve colocar elementos válidos no espaço de nomes de destino quando localmente declarado no XSD; caso contrário, XML válido deve colocar localmente elementos em nenhum namespace declarado.
  • minoria minúscula do tempo: Alterar o XML em conformidade com os do XSD exigência de que assignment estar em nenhum namespace. Isto pode ser conseguido, por exemplo, adicionando xmlns="" ao elemento assignment.

importante notar com elementFormDefault é que ela se aplica a localmente elementos definidos, elementos normalmente chamados dentro de um bloco complexType, ao contrário de elementos globais definidas no nível superior do esquema. Com elementFormDefault = "qualificado" pode abordar elementos locais no esquema de dentro do documento XML usando namespace de destino do esquema como namespace padrão do documento.

Na prática, usar elementFormDefault = "qualificado" para ser capaz de declarar elementos em blocos aninhados, caso contrário você terá que declarar todos os elementos no nível superior e consulte-as no esquema de elementos aninhados usando o atributo ref, resultando em um esquema muito menos compacto.

Este bit no XML Schema Primer fala sobre isso: http://www.w3.org/TR / xmlschema-0 / # NS

elementFormDefault = "qualificado" é usado para controlar o uso de namespaces em documentos da instância XML (arquivo .xml), ao invés de namespaces no documento de esquema em si (arquivo .xsd).

Ao especificar elementFormDefault = "qualificado" impomos declaração de namespace para ser usado em documentos validados com este esquema.

É prática comum para especificar esse valor para declarar que os elementos devem ser qualificados em vez de sem ressalvas. No entanto, desde attributeFormDefault = "inqualificável" é o valor padrão, ele não precisa ser especificado no documento de esquema, se não se quiser qualificar os espaços de nomes.

Tenho notado que XMLSpy (pelo menos 2011 versão) precisa de um TargetNamespace definido se elementFormDefault = "qualificado" é usado. Caso contrário, não irá validar. E também não irá gerar xmls com namespace prefixos

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top