O que elementFormDefault fazer em XSD?
-
13-09-2019 - |
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>
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 ??strong>:. 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 queassignment
está no namespace de destino como seria esperar.
- Isto porque o valor padrão para
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 elementoassignment
. ( WTF ) - O que isso realmente significa: A
{
e}
torno meiosassignment
que a validação estava esperandoassignment
em nenhum namespace aqui. Infelizmente, quando se diz que encontrou um elementoassignment
, 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 elementoxsd: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, adicionandoxmlns=""
ao elementoassignment
.
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