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

Elemento "venda" não está vinculado.

Boa noite, estou seguindo o código passo a passo, mesmo assim um erro de compilação não permite eu seguir em frente.

Abaixo segue as classes Java e arquivos Xml e XSD.

Grato pela ajuda.

Estrutura dos arquivos

src/(default package) Principal.java src/(default package) Produto.java src/vendas.xml src/formatoVendas.xml

Erro do console

Exception in thread "main" org.xml.sax.SAXParseException; systemId: file:///C:/Users/Gilmar/Documents/workspace/XmlProject/src/vendas.xml; lineNumber: 2; columnNumber: 129; O prefixo "xsi" do atributo "xsi:noNamespaceSchemaLocation" associado a um tipo de elemento "venda" não está vinculado.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
    at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
    at Principal.main(Principal.java:24)

vendas.xml

Obs.: O eclipse informa um erro na linha 2

<?xml version="1.0" ?>
<venda moeda="real" xsi:noNamespaceSchemaLocation="formatoVendas.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>

formatoVendas.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>

Principal.java

import java.io.IOException;

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

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class Principal {

    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        factory.setValidating(true);
        factory.setNamespaceAware(true);
        factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
                "http://www.w3.org/2001/XMLSchema");

        DocumentBuilder builder = factory.newDocumentBuilder();

        Document doc = builder.parse("src/vendas.xml");

        NodeList produtos = doc.getElementsByTagName("produto");
        Element element;

        for (int i = 0; i < produtos.getLength(); i++) {

            element = (Element) produtos.item(i);
            Produto produto = new Produto(element.getElementsByTagName("nome").item(0).getTextContent(),
                    element.getElementsByTagName("preco").item(0).getTextContent());
            System.out.println(produto);
        }

    }

}

Produto.java

public class Produto {

    private String nome;
    private String preco;

    public Produto(String nome, String preco) {
        this.nome = nome;
        this.preco = preco;
    }

    public String getPreco() {
        return preco;
    }

    public void setPreco(String preco) {
        this.preco = preco;
    }

    @Override
    public String toString() {
        return "Nome: " + this.nome + " Preço: " + this.preco;
    }

}
1 resposta
solução!

Olá Gilmar tudo bem?

Tente trocar no arquivo vendas.xml de:

xsi:noNamespaceSchemaLocation="formatoVendas.xsd"

Para

xsd:noNamespaceSchemaLocation="formatoVendas.xsd"

Veja se isso resolve.

[]s