Por que meu teste XML está falhando com o esquema XSD muito simples?
-
26-09-2019 - |
Pergunta
Eu sou um pouco novato no esquema XML. Eu ficaria grato se alguém me ajudasse a entender por que meu XML não está sendo validado com o esquema:
Aqui está meu esquema:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/testSchema" xmlns="http://www.example.org/testSchema">
<xs:element name="Employee">
<xs:complexType>
<xs:sequence>
<xs:element name="Name">
<xs:complexType>
<xs:sequence>
<xs:element name="FirstName" />
<xs:element name="LastName" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Aqui está o meu teste xml:
<?xml version="1.0" encoding="UTF-8"?>
<Employee xmlns="http://www.example.org/testSchema">
<Name>
<FirstName>John</FirstName>
<LastName>Smith</LastName>
</Name>
</Employee>
Estou recebendo o seguinte erro pelo Eclipse XML Editor/Validador:
cvc-complex-type.2.4.a: Invalid content was found starting with element 'Name'. One of '{Name}' is expected.
Eu não conseguia entender o que há de errado com este esquema ou meu XML.
Solução
Tudo o que você precisa fazer é adicionar eletFormDefault = "qualificado" e você ficará bem. Para entender esse comportamento, leia "Você está qualificado?" seção @ http://msdn.microsoft.com/en-us/library/ms950796.aspx
Outras dicas
Basta adicionar o elementFormDefault = "qualificado" aos atributos do esquema.
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/testSchema"
elementFormDefault="qualified"
xmlns="http://www.example.org/testSchema">
E seu original vai funcionar
<?xml version="1.0" encoding="utf-8"?>
<Employee xmlns="http://www.example.org/testSchema">
<Name>
<FirstName>John</FirstName>
<LastName>Smith</LastName>
</Name>
</Employee>
Parece que você está deixando de especificar como validar o FirstName
e LastName
elementos; Dê as especificações do elemento para aquelas type="xsd:string"
(Onde xsd
Precisa ser mapeado para o espaço de nome de dados do esquema XML, é claro) e tudo deve estar bem.
Mas é melhor você não aninhar esses elementos tão profundos. Coloque todos eles no mesmo nível e use ref="Name"
para vincular todos eles; Isso torna seu esquema muito mais flexível e utilizável.