javax.xml.bind.UnmarshalException: неожиданный элемент (uri:MyProtocol.xsd, локальный:MyFrame). Ожидаемые элементы (нет)

Я пытаюсь распаковать файл XML, но продолжаю получать эту ошибку:

javax.xml.bind.UnmarshalException: unexpected element (uri:"MyProtocol.xsd", local:"MyFrame"). Expected elements are (none)

Я использую Axis2 для создания классов с привязкой ADB из моего файла wsdl. Это корень .wsdl:

<?xml version="1.0" encoding="utf-8"?>
<definitions xmlns:xs="http://www.w3.org/2001/XMLSchema/"
    xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="MyProtocol.xsd"
    xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:wsi="http://ws-i.org/profiles/basic/1.1/xsd"
    xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="MyProtocol.xsd">

    <types>
        <xs:schema targetNamespace="MyProtocol.xsd"
            xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="MyProtocol.xsd"
            elementFormDefault="qualified">

            <xs:import namespace="http://ws-i.org/profiles/basic/1.1/xsd"
                schemaLocation="http://ws-i.org/profiles/basic/1.1/swaref.xsd" />

            <xs:element name="MyFrame">
                <xs:complexType>
                    <xs:choice maxOccurs="unbounded">
                        ...

Это код, который я должен распаковать, и я предполагаю, что он не работает с привязками Axis2 и ADB.

public class Foobar<T>
{
   private T obj;
   private Class<T> type;

   public Foobar(Class<T> type) {
       this.type = type;
   }

   public void unmarshalXML(String xml) {
       JAXBContext jaxbContext;
       Unmarshaller unmarshaller;
       StringReader reader;

       try {
           jaxbContext = JAXBContext.newInstance(type);
           unmarshaller = jaxbContext.createUnmarshaller();

           reader = new StringReader(xml);
           obj = (T) unmarshaller.unmarshal(reader);

       } catch(JAXBException e) {
           e.printStackTrace();
       }
   }
}

Axis2 генерирует класс-заглушку, в котором есть все геттеры, сеттеры и классы из вариантов моей схемы. Я использую этот класс и вызываю метод unmarshal следующим образом:

Foobar<MyStub.MyFrame> foobar = new Foobar<MyStub.MyFrame>(MyStub.MyFrame.class);

// Unmarshal
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
           + "<MyFrame xmlns=\"MyProtocol.xsd\">"
           + "<YC>"
           + "<SenderId>172</SenderId>"
           + "<RequestId>123saA</RequestId>"
           + "<SubNumber>5558879876</SubNumber>"
           + "</YC>"
           + "</MyFrame>";

foobar.unmarshalXML(xml);

Затем я получаю сообщение об ошибке выше. Почему это происходит? Мой код неправильный?


person o.o    schedule 10.06.2016    source источник
comment
Пожалуйста, используйте эту ссылку stackoverflow.com/questions/20586737/   -  person s7vr    schedule 12.06.2016
comment
Спасибо за ответ. Однако я не думаю, что смогу использовать информацию из этой ссылки. Я считаю, что не могу использовать код JAXB, который у меня есть, потому что я использую ADB. Ссылка говорит об использовании аннотаций, однако классы, созданные Axis2 с использованием ADB, не используют аннотации.   -  person o.o    schedule 12.06.2016


Ответы (1)


Неважно, я разобрался. Если у вас есть этот XML:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<MyFrame>
    <Data>
        <ID>172</ID>
        <Name>101</Name>
        <Date>11241987</Date>
    </Data>
</MyFrame>

Вы можете распаковать его с помощью приведенного ниже кода. Код в OP работает только при использовании JAXB. Однако в моем сценарии я использовал ADB.

Отменить маршалирование

XMLStreamReader reader = XMLInputFactory.newInstance()
            .createXMLStreamReader(new ByteArrayInputStream(someXMLString.getBytes()));

SomeClass myClass = SomeClass.Factory.parse(reader);

Marshal (если вы хотите получить вышеуказанный XML от класса):

OMElement omElement = myClass.getOMElement
                (SomeClass.MY_QNAME, OMAbstractFactory.getSOAP12Factory());
String someXMLString = omElement.toStringWithConsume();
person o.o    schedule 13.06.2016