XML unmarshalling с использованием Jaxb с пространствами имен и схемой

77
8

У меня есть XML-документ, который выглядит так:


<?xml version="1.0" encoding="UTF-8"?>
<xs:msgdata xmlns:xs="http://www.myCompany.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.myCompany.com msgdata.xsd">
<xs:msgid>MsgID001</xs:msgid>
<xs:msgHash>hlkJKLHljkhkjlHKJLHkjl6y987HJKH</xs:msgHash>
</xs:msgdata>

Мне также был отправлен документ схемы (называемый msgdata.xsd). Я использую JAXB, чтобы развязать вышеупомянутый XML-документ к объекту Java.
Ниже показан код unmarshalling:


final JAXBContext context = JAXBContext.newInstance(clazz);
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new File("C:\\temp\\msgdata.xsd"));

final Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setSchema(schema);

return (T) unmarshaller.unmarshal(new StringReader(xml));


Целевой объект для XML показан ниже (объект затем преобразуется в спящий объект.


@XmlRootElement(name = "msgdata")
public class Message {

private String msgid;
private String msgHash;

@XmlElement(name = "msgid")
public String getMsgid() {
return msgid;
}

public void setMsgid(String msgid) {
this.msgid = msgid;
}

@XmlElement(name = "msgHash")
public String getMsgHash() {
return msgHash;
}
public void setMsgHash(String msgHash) {
this.msgHash = msgHash;
}


Несколько вопросов:


    У меня есть служба отдыха, где я получаю XML-документ в формате, показанном выше. Какова ссылка на документ схемы. Я знаю, что документ схемы используется для проверки XML-документа. Я думаю, что он будет работать, так это то, что я использую эту схему для проверки документов XML, которые я получаю через службу REST. Теперь проблема в том, как получить доступ к схеме? Я просто храню его где-то в своей файловой системе и получаю доступ к нему, как показано выше?

В документе XML есть ссылка на схему (см. запись schemaLocation). Как он найдет документ схемы в моей файловой системе? Требуется ли эта ссылка на схему в документе XML?


    XML-документ, поскольку он теперь не может быть отменен. Когда я пытаюсь размонтировать его, я получаю следующую ошибку:


    Вызывает: javax.xml.bind.UnmarshalException: неожиданный элемент (uri: "http://www.myCompany.com", локальный: "msgdata" ). Ожидаемые элементы являются < {} msgdata >         at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:662) [JAXB-осущ-2.2.4.jar:]         at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:258) [JAXB-осущ-2.2.4.jar:]         at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:253) [JAXB-осущ-2.2.4.jar:]         at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:120) [JAXB-осущ-2.2.4.jar:]         at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext $DefaultRootLoader.childElement(UnmarshallingContext.java:1063) [JAXB-осущ-2.2.4.jar:]         at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement (UnmarshallingContext.java:498) [JAXB-осущ-2.2.4.jar:]         at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:480) [JAXB-осущ-2.2.4.jar:]         at com.sun.xml.bind.v2.runtime.unmarshaller.ValidatingUnmarshaller.startElement(ValidatingUnmarshaller.java:102) [JAXB-осущ-2.2.4.jar:]         at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:150) [JAXB-осущ-2.2.4.jar:]         at org.apache.xerces.parsers.AbstractSAXParser.startElement(Неизвестно Источник) [xercesImpl-2.9.1.jar:]         at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Неизвестно Источник) [xercesImpl-2.9.1.jar:]         at org.apache.xerces.impl.XMLNSDocumentScannerImpl $NSContentDispatcher.scanRootElementHook(Неизвестно Источник) [xercesImpl-2.9.1.jar:]         at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl $FragmentContentDispatcher.dispatch(Неизвестно Источник) [xercesImpl-2.9.1.jar:]         at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Неизвестно Источник) [xercesImpl-2.9.1.jar:]         at org.apache.xerces.parsers.XML11Configuration.parse(Неизвестный источник) [xercesImpl-2.9.1.jar:]         at org.apache.xerces.parsers.XML11Configuration.parse(Неизвестный источник) [xercesImpl-2.9.1.jar:]         at org.apache.xerces.parsers.XMLParser.parse(Неизвестный источник) [xercesImpl-2.9.1.jar:]         at org.apache.xerces.parsers.AbstractSAXParser.parse(Неизвестный источник) [xercesImpl-2.9.1.jar:]         at org.apache.xerces.jaxp.SAXParserImpl $JAXPSAXParser.parse(Неизвестно Источник) [xercesImpl-2.9.1.jar:]         at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0 (UnmarshallerImpl.java:217) [JAXB-осущ-2.2.4.jar:]         at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:189) [JAXB-осущ-2.2.4.jar:]         в javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:136) [JBoss-JAXB-api_2.2_spec-1.0.3.Final.jar: 1.0.3.Final]         в javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:193) [JBoss-JAXB-api_2.2_spec-1.0.3.Final.jar: 1.0.3.Final]         ... 31 подробнее



Я думал, что пространство имен определено в XML-документе. Я либо неправильно использую схему, либо неправильное определение пространства имен. Что я делаю неправильно?


Спасибо.

спросил(а) 2020-04-04T01:16:27+03:00 3 месяца назад
1
Решение
108

В общем, для получения доступа к файлам (XSD или другим) в вашем веб-приложении Java (поскольку вы упомянули REST), вы можете запустить здесь. Никогда не полагайтесь на абсолютные пути, на развертывание, а также на соображения безопасности.


Атрибуты местоположения схемы xsi - это просто подсказки; они не требуются. Даже если они присутствуют, их не нужно рассматривать. Для приложения на стороне сервера я бы никогда не использовал их; следует полагаться на встроенные ресурсы или использовать концепцию, подобную каталогу, в надежном/безопасном месте.


Тот факт, что он не является немаршалированным, ясен в сообщении об ошибке: он ожидает элемент no-namespace < {} msgdata > в отличие от < {http://www.myCompany.com} msgdata > .

Вам нужно изменить XML или скомпоновать свой класс, чтобы включить такие вещи, как @XmlElement (name= "...", namespace = "http://www.myCompany.com" )


Я бы сказал, что данная схема и XML верны, ваши аннотации не синхронизированы.

ответил(а) 2020-04-04T01:30:00.220880+03:00 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема