Validação XML com XSD no Visual Studio IDE

96

Sei que já fiz isso antes, mas não está funcionando hoje, nem consigo encontrar nenhum lugar que explique como fazer. Pode ser minha falta de sono, mas suspeito de gremlins.

Tenho um documento XML e um diretório cheio de XSDs que o definem. Como faço para configurar o IDE do Visual para me notificar sobre falhas de validação e, em seguida, fornecer uma lista do intellisense de tags e atributos válidos em um determinado contexto?

O que eu tentei:

  • Adicionei os XSDs ao projeto com o documento XML.
  • Eu adicionei os XSDs à lista XML Schema (no item de menu XML / Schemas ...).
  • Inclusive, incluí os atributos schemaLocation e noNamespaceSchemaLocation no documento XML.

O Visual Studio ainda não está abrindo mão de nenhuma depuração útil ou de informações de edição. Tentei 2010 e 2008 (já fiz isso antes, em 2008, pensei)

Atualização: pedi a outro desenvolvedor que tentasse fazer isso e ele também falhou. Ele sabe que fez isso com outros documentos XML e fez com que funcionasse. Em seguida, baixei o editor XML Oxygen e funcionou bem nos mesmos arquivos XML e XSD, então os arquivos parecem estar bem (ou Oxygen é mais tolerante / flexível..)

Jim McKeeth
fonte

Respostas:

138

Você precisará associar o documento XML no Visual Studio ao arquivo XSD que possui.

  1. Você deve ver algo assim na janela Propriedades do documento XML:

    Propriedades XML> Esquema

  2. No editor do conjunto de esquemas XML (abre quando você clica nas reticências (...) na caixa de texto "Esquemas" em sua janela Propriedades), você precisa ter certeza de que seu esquema está presente. Além disso, certifique-se de que a Usecoluna para esse esquema esteja habilitada - se não, clique nela - você verá uma lista suspensa de opções, escolha Useaquela com a marca de seleção verde:

    Seletor de esquema XML

  3. Certifique-se de que a janela Lista de erros do Visual Studio esteja visível (menu Exibir> Lista de erros). Isso mostrará todas as inconsistências entre as definições de esquema XML e XSD.

  4. Depois que tudo isso estiver pronto, o editor de XML do Visual Studio deve destacar os problemas com seu XML no editor usando rabiscos azuis:

    Exemplo de Erro

marc_s
fonte
Obrigado, essa é uma ótima explicação detalhada, mas a minha ainda não está funcionando. Eu não sabia que você poderia obter a lista de esquemas de propriedades como essa.
Jim McKeeth
@Jim McKeeth: e se você modificar seu XML e salvá-lo novamente? Às vezes, a validação XML precisa de um gatilho para iniciar ...
marc_s
Aceitei sua resposta, embora não tenha funcionado para mim. Estou supondo que meu sistema foi apenas mangueira, mas mudei para um novo computador e tudo funciona bem agora.
Jim McKeeth,
38
@jim Não tenho certeza se você teve o mesmo problema, mas gastei uma quantidade absurda de tempo antes de perceber que o arquivo XML deve ser aberto no editor e o foco deve estar no editor quando você abre a janela Propriedades. Só então você obtém as propriedades do "Documento XML" onde pode atribuir um esquema. Se o foco estiver no Gerenciador de Soluções, a janela Propriedades exibe apenas as propriedades do arquivo, ou seja, nenhuma atribuição de esquema é possível lá.
herzbube
2
Acho que você deve adicionar as descobertas de @herzbube na própria resposta.
Cinza
35

Você não precisa associar manualmente os arquivos no Visual Studio - ele irá corresponder automaticamente um arquivo XML a um arquivo XSD se você os tiver aberto e tiver seu namespace definido corretamente.

Para definir o namespace:

No elemento raiz do arquivo XML:

<Data xmlns='http://yourdomain.com/yourschema.xsd'>
    ...
</Data>

No elemento de esquema do arquivo XSD:

<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://yourdomain.com/yourschema.xsd"
    xmlns:this="http://yourdomain.com/yourschema.xsd"
    elementFormDefault="qualified">
    ...
</xs:schema>

Uma observação sobre o uso de Tipos em seu esquema quando você tem um targetNamespace

Como você está especificando um targetNamespaceem seu esquema, qualquer referência a tipos definidos no esquema precisará ser prefixada com um namespace (é por isso que adicionamos o xmlns:thisatributo no <xs:schema />elemento acima ).

<!-- Define the type as normal -->
<xs:complexType name="Row">
    <xs:sequence>
        <xs:element name="Name" type="xs:string" minOccurs="1" maxOccurs="1" />
        <xs:element name="Value" type="xs:float" minOccurs="1" maxOccurs="1" />
    </xs:sequence>
</xs:complexType>
<!-- Use the type (note the "this:" prefix) -->
<xs:element name="Row" type="this:Row" minOccurs="0" maxOccurs="unbounded" />
Ross McNab
fonte
3

Outro ponto de falha aqui é o Windows 7 "bloqueando" arquivos de esquema ... clique com o botão direito do mouse no arquivo xsd no disco, Propriedades> Geral e se estiver bloqueado, você terá um botão "Desbloquear". Isso estava fazendo com que minha validação XML falhasse no VS2012.

EJA
fonte
1

O seu xsd contém um atributo "targetNamespace" /schema/@targetNamespacesemelhante ao namespace que você está referenciando no xml?

Exemplos:

XSD :

<xs:schema .... targetNamespace="Datafile.xsd" ... >

XML :

<data xmlns="Datafile.xsd" >...</data>

Consulte também: O intellisense XML / XSD não funciona no Visual Studio 2010

k3b
fonte
0

Eu tive o mesmo problema, mas o VS já estava referenciando meu esquema corretamente. Acontece que o arquivo que eu estava tentando validar não tinha uma extensão de arquivo 'xml'. Adicionado .xml ao final do meu nome de arquivo e a validação começou a funcionar.

John Livermore
fonte