Validar um arquivo XML

No KB da elipse é sugerido um processo para ler um arquivo XML.
Queria saber se existe uma forma de fazer a validação desse arquivo usando um XSD.

Eu testei esse seguinte código mas ele sempre dá como válido o arquivo.
Dim xmlDoc, xsdCache

	Set xmlDoc = CreateObject("MSXML2.DOMDocument")
	xmlDoc.async = False
	xmlDoc.validateOnParse = True
	xmlDoc.resolveExternals = True
	
	' Carrega o documento XML para o objeto DOMDocument
	xmlDoc.load(caminhoEstruturaXML)
	
	' Verifica se ocorreu algum erro durante o carregamento do documento XML
	If xmlDoc.parseError.errorCode <> 0 Then
    	msgbox "Erro ao carregar o documento XML: " & xmlDoc.parseError.reason
	Else
    	' Cria uma instância do objeto MSXML2.XMLSchemaCache
    	Set xsdCache = CreateObject("MSXML2.XMLSchemaCache")
	
    	' Adiciona o esquema (XSD) ao cache de esquemas
    	xsdCache.add "urn:exemplo", caminhoEstruturaXSD
	
    	' Associa o esquema ao documento XML
    	xmlDoc.schemas = xsdCache
	
    	' Verifica se o documento XML é válido
    	If xmlDoc.validate() Then
        	msgbox "O documento XML é válido."
    	Else
        	msgbox "O documento XML não é válido: " & xmlDoc.parseError.reason
    	End If
	End If

Alguém tem alguma sugestão?

Dim objXml
Dim objXsd
Dim objSchema

' carrega o arquivo XML e XSD
Set objXml = CreateObject("MSXML2.DOMDocument.6.0")
objXml.async = False
objXml.load("file.xml")

Set objXsd = CreateObject("MSXML2.DOMDocument.6.0")
objXsd.async = False
objXsd.load("file.xsd")

' cria o objeto XMLSchemaCache e adiciona o XSD
Set objSchema = CreateObject("MSXML2.XMLSchemaCache.6.0")
objSchema.add "", objXsd

Set objXml.Schemas = objSchema

' valida o arquivo XML
If (objXml.validate().errorCode = 0) Then
    MsgBox "Arquivo XML válido"
Else
    MsgBox "Arquivo XML inválido"
End If

:card_file_box: Arquivos de exemplo

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="book">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="title" type="xs:string"/>
        <xs:element name="author" type="xs:string"/>
        <xs:element name="year" type="xs:integer"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
<!-- exemplo de arquivo valido -->
<?xml version="1.0" encoding="UTF-8"?>
<book>
    <title>O Fim da Eternidade</title>
    <author>Isaac Asimov</author>
    <year>1955</year>
</book>
<!-- exemplo de arquivo invalido (<year> nao eh um inteiro) -->
<?xml version="1.0" encoding="UTF-8"?>
<book>
    <title>O Fim da Eternidade</title>
    <author>Isaac Asimov</author>
    <year>Mil novecentos e cinquenta e cinco</year>
</book>
1 Like

Você pode usar somente o objeto Microsoft.XMLDOM para ler o arquivo XML, conforme o exemplo a seguir:

Set xmlDoc = CreateObject("Microsoft.XMLDOM")
...
xmlDoc.Load("nomedoarquivo.xml")

No arquivo nomedoarquivo.xml, use o atributo xsi:noNamespaceSchemaLocation no nó raiz para indicar um arquivo XSD de esquema:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="nomedoarquivo.xsd">

</root>

Dessa forma a propriedade xmlDoc.parseError.errorCode vai retornar corretamente o erro caso o conteúdo do arquivo XML não corresponda ao esquema declarado naquele arquivo XSD.

1 Like