Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvida no Ex. 4 da Aula 2 - Garantindo o formato de arquivos xml usando XSD

Na validação, ele não associa o xsd ao xml.

Segue xml:


    <?xml version="1.0" ?>
<venda moeda="real" xsd:noNamespaceSchemaLocation="venda.xsd"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance">
    <formaDePagamento>Cartao</formaDePagamento>
    <produtos>
        <produto>
            <nome>Livro da casa do código</nome>
            <preco>59.90</preco>
        </produto>
        <produto>
            <nome>Livro de java</nome>
            <preco>59.90</preco>
        </produto>
    </produtos>
</venda>

Segue xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="produto">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="nome" type="xsd:string" />
                <xsd:element name="preco" type="xsd:string" />
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

    <xsd:element name="venda">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="formaDePagamento" type="xsd:string" />
                <xsd:element name="produtos">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element ref="produto" maxOccurs="unbounded" />
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
            <xsd:attribute name="moeda" type="xsd:string" />
        </xsd:complexType>
    </xsd:element>


</xsd:schema>

Segue erro, notar que a URI está nula:

Error: URI=null Line=3: cvc-elt.1: Não pode localizar a declaração do elemento 'venda'.

Segue código:

package br.com.alura.sistema;

import java.io.FileInputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class Leitor {
    public static void main(String[] args) throws Exception {
        DocumentBuilderFactory fabrica = DocumentBuilderFactory.newInstance();
        fabrica.setValidating(true);
        fabrica.setNamespaceAware(true);
        fabrica.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");

        DocumentBuilder builder = fabrica.newDocumentBuilder();

        Document documento = builder.parse(new FileInputStream("src/venda.xml"));
        // 2
        Element venda = documento.getDocumentElement();
        System.out.println(venda.getAttribute("moeda"));
        // 1
        Element formaDePagamento = (Element) documento.getElementsByTagName("formaDePagamento").item(0);
        System.out.println(formaDePagamento.getTextContent());
        // 3
        NodeList produtos = venda.getElementsByTagName("produto");

        for (int i = 0; i < produtos.getLength(); i++) {
            Element produto = (Element) produtos.item(i);
            String nome = produto.getElementsByTagName("nome").item(0).getTextContent();
            String preco = produto.getElementsByTagName("preco").item(0).getTextContent();
            Produto prod = new Produto(nome, Double.parseDouble(preco));
            System.out.println("-----------");
            System.out.println(prod);
            System.out.println("-----------");
        }

    }
}
1 resposta
solução!

Eu não estava colocando o "src/";

Segue trecho do xsd modificado: xsd:noNamespaceSchemaLocation="src/venda.xsd"