O que elementFormDefault
faz e quando deve ser usado?
Então, encontrei algumas definições para elementFormDefault
valores:
qualificado - elementos e atributos estão no targetNamespace do esquema
não qualificado - elementos e atributos não têm um namespace
Portanto, a partir dessa definição, eu pensaria que, se um esquema é definido como qualificado, por que você deve prefixar o tipo com o namespace? E quais são os cenários que você teria definido como não qualificado para esse assunto? Eu tentei pesquisar no Google, mas tudo que consegui foram algumas páginas do W3C que eram extremamente difíceis de entender.
Este é o arquivo com o qual estou trabalhando agora, por que preciso declarar o tipo de target:TypeAssignments
quando declaro targetNamespace
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>
Considere o seguinte ComplexType
AuthorType
usado peloauthor
elemento<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"/>
E se
elementFormDefault="unqualified"
então a seguinte instância XML é válida
<x:author xmlns:x="http://example.org/publishing"> <name>Aaron Skonnard</name> <phone>(801)390-4552</phone> </x:author>
o atributo de nome dos autores é permitido sem especificar o namespace (não qualificado). Todos os elementos que fazem parte de
<xsd:complexType>
são considerados locais para complexType.E se
elementFormDefault="qualified"
então a instância deve ter os elementos locais qualificados
<x:author xmlns:x="http://example.org/publishing"> <x:name>Aaron Skonnard</name> <x:phone>(801)390-4552</phone> </x:author>
por favor consulte este link para mais detalhes
fonte
Resposta e explicação novas e detalhadas para uma pergunta antiga e frequente ...
Resposta curta : se você não adicionar
elementFormDefault="qualified"
axsd:schema
, ounqualified
valor padrão significa que os elementos declarados localmente não estão em nenhum namespace .Há muita confusão sobre o que
elementFormDefault
faz, mas isso pode ser rapidamente esclarecido com um pequeno exemplo ...Versão simplificada 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 chave:
assignment
elemento é definido localmente.elementFormDefault
éunqualified
.elementFormDefault="qualified"
modo queassignment
esteja no namespace de destino como seria de se esperar.form
atributo raramente usado emxs:element
declarações para as quaiselementFormDefault
estabelece valores padrão.XML aparentemente válido
Este XML parece que deve ser válido de acordo com o XSD acima:
<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 prévio:
assignments
locaisassignments
e todos os seus descendentes no namespace padrão (http://www.levijackson.net/web340/ns
).Erro de validação perplexo
Apesar de parecer válido, o XML acima produz o seguinte erro de validação confuso:
Notas:
assignment
elemento, mas na verdade encontrou umassignment
elemento. ( WTF ){
e}
ao redorassignment
significa que a validação não esperavaassignment
em nenhum namespace aqui. Infelizmente, quando diz que encontrou umassignment
elemento, não menciona que o encontrou em um namespace padrão que difere de nenhum namespace.Solução
elementFormDefault="qualified"
aoxsd:schema
elemento do XSD. Isso significa que um XML válido deve colocar elementos no namespace de destino quando declarado localmente no XSD; caso contrário, o XML válido deve colocar os elementos declarados localmente em nenhum namespace.assignment
não haja namespace. Isso pode ser alcançado, por exemplo, adicionandoxmlns=""
aoassignment
elemento.Créditos: Obrigado a Michael Kay pelo feedback útil sobre esta resposta.
fonte
Importante observar com elementFormDefault é que ele se aplica localmente elementos definidos , normalmente denominados elementos dentro de um bloco complexType, em oposição a elementos globais definidos no nível superior do esquema. Com elementFormDefault = "qualificado", você pode endereçar elementos locais no esquema de dentro do documento xml usando o namespace de destino do esquema como o namespace padrão do documento.
Na prática, use elementFormDefault = "qualificado" para poder declarar elementos em blocos aninhados, caso contrário, você terá que declarar todos os elementos no nível superior e se referir a eles no esquema em elementos aninhados usando o atributo ref, resultando em um esquema muito menos compacto.
Esta parte do XML Schema Primer fala sobre isso: http://www.w3.org/TR/xmlschema-0/#NS
fonte
elementFormDefault = "qualificado" é usado para controlar o uso de namespaces em documentos de instância XML (arquivo .xml), em vez de namespaces no próprio documento de esquema (arquivo .xsd).
Ao especificar elementFormDefault = "qualificado", impomos a declaração de namespace a ser usada em documentos validados com este esquema.
É prática comum especificar esse valor para declarar que os elementos devem ser qualificados em vez de não qualificados. No entanto, como attributeFormDefault = "unqualified" é o valor padrão, ele não precisa ser especificado no documento de esquema, se não se quiser qualificar os namespaces.
fonte
Percebi que XMLSpy (pelo menos versão 2011) precisa de um targetNameSpace definido se elementFormDefault = "qualificado" for usado. Caso contrário, não validará. E também não vai gerar xmls com prefixos de namespace
fonte