Я пытаюсь выполнить маршалинг с использованием xsd для создания файла xml, но я получил эту ошибку: cv c -elt.1: Невозможно найти объявление элемента 'client'. Я трачу несколько часов, чтобы выяснить, что проблема связана с моим целевым пространством имен Client.xsd. Если я удаляю это, это работает. Однако это невозможно, потому что у меня есть другие xsd и xml, которые зависят от этого xsd. Обычно это проблема между xsd и xml, но я не использую xml в этой специфической c части кода, только xsd.
Можете ли вы помочь мне? Заранее спасибо.
Java Класс:
public class JaxbExec {
public static void main(String[] args) {
Client client = Client.builder()
.name("Jon")
.age(20)
.gender("MALE")
.documentId(12345678988L)
.availableAccountCredit(new BigDecimal(200))
.build();
marshal(
"src/main/resources/xsd/Client.xsd", client, "src/main/resources/xmlclienttest.xml");
}
public static boolean marshal(String schemaName, Object object, String xmlfile) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(object.getClass());
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new File(schemaName));
// output pretty printed
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
// check against schema
jaxbMarshaller.setSchema(schema);
jaxbMarshaller.marshal(object, new File(xmlfile));
log.info("xml created");
} catch (Exception e) {
log.info("Error: " + e);
return false;
}
return true;
}
XSD:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.cc.com.au/training/client"
xmlns="http://www.cc.com.au/training/client"
elementFormDefault="qualified">
<!-- Client -->
<xs:element name="client">
<xs:complexType>
<xs:sequence>
<!-- Name -->
<xs:element name="name" type="xs:string"/>
<!-- Age-->
<xs:element name="age" type="xs:int" minOccurs="0"/>
<!-- Gender -->
<xs:element name="gender" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="MALE"/>
<xs:enumeration value="FEMALE"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<!-- DocumentId-->
<xs:element name="documentId" type="xs:long"/>
<!-- availableAccountCredit-->
<xs:element name="availableAccountCredit" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>