XML-строка JAXB для объекта Java - неожиданный элемент - PullRequest
0 голосов
/ 22 января 2019

Пожалуйста, помогите!

Я пытаюсь демонтировать приведенную ниже строку XML в класс Java.Требуется только захватить некоторые элементы, а не все:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type='text/xsl' href='http://myService/rs/../xsl/searchRetrieveResponse.xsl'?>
<searchRetrieveResponse
    xmlns="http://www.loc.gov/zing/srw/"
    xmlns:srw5="info:srw/extension/5/restrictorSummary">
    <version>1.2</version>
    <numberOfRecords>1</numberOfRecords>
    <records>
        <record>
            <recordSchema>info:srw/schema/1/CDFXML</recordSchema>
            <recordPacking>xml</recordPacking>
            <recordData>
                <institution active="true" test="true" training="false"
                    xmlns="info:rfa/rfaRegistry/xmlSchemas/institution"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="info:rfa/rfaRegistry/xmlSchemas/institution http://worldcat.org/registry/xsd/collections/Institutions/institution.xsd">
                    <identifier>info:rfa/Institutions/113500</identifier>
                    <versionID>2016-02-17T20:01:22.355Z</versionID>
                    <nameLocation
                        xmlns="info:rfa/rfaRegistry/xmlSchemas/institutions/nameLocation"
                        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="info:rfa/rfaRegistry/xmlSchemas/institutions/nameLocation http://worldcat.org/registry/xsd/collections/Institutions/nameLocation.xsd">
                        <lastUpdated>2015-09-27</lastUpdated>
                        <lastUpdatedTime>03:06:43</lastUpdatedTime>
                        <first>First Name</first>
                    </nameLocation>
                    <identifiers
                        xmlns="info:rfa/rfaRegistry/xmlSchemas/institutions/identifiers"
                        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="info:rfa/rfaRegistry/xmlSchemas/institutions/identifiers http://worldcat.org/registry/xsd/collections/Institutions/identifiers.xsd">
                        <lastUpdated>2016-02-17</lastUpdated>
                        <lastUpdatedTime>15:01:22</lastUpdatedTime>
                        <age>23</age>
                        <age>55</age>
                    </identifiers>
                    <opac available="true" intranetOnly="false"
                        xmlns="info:rfa/rfaRegistry/xmlSchemas/institutions/opac"
                        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="info:rfa/rfaRegistry/xmlSchemas/institutions/opac http://worldcat.org/registry/xsd/collections/Institutions/opac.xsd">
                        <lastUpdated>2009-12-03</lastUpdated>
                        <lastUpdatedTime>17:43:52</lastUpdatedTime>
                        <url1>facebook</url1>
                        <url2>google</url2>
                        <prefix/>
                    </opac>
                </institution>
            </recordData>
            <recordPosition>1</recordPosition>
        </record>
    </records>
</searchRetrieveResponse>

Из этого файла я только хочу отобразить эти теги в своем классе Java ниже

<first> <age> <age> <url1> <url2>

Класс Java:

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlRootElement(name = "searchRetrieveResponse")
    public class MyInfo {
        @XmlElement(name = "first")
        private String first;

        @XmlElement(name = "age")
        private List<String> age;

        @XmlElement(name = "url1")
        private String url1;

        @XmlElement(name = "url2")
        private String url2;
    }

Необработанная реализация:

public static void main(String[] args) {

    JAXBContext jaxbContext;
    try {
        jaxbContext = JAXBContext.newInstance(MyInfo.class);

        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

        MyInfo myInfo = (MyInfo) jaxbUnmarshaller.unmarshal(
                     new StringReader( * * MY_XML_STRING **));

    catch(JAXBException ex){
            log.error("Error - ", ex);
        }
    }

Ошибка:

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.loc.gov/zing/srw/", local:"searchRetrieveResponse"). Expected elements are <{}searchRetrieveResponse>
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:744)
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:262)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1149)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:574)...

В Моих зависимостях gradle:

jaxbApi  : "javax.xml.bind:jaxb-api:2.4.0-b180830.0359",
jaxbImpl : "com.sun.xml.bind:jaxb-impl:2.4.0-b180830.0438",
jaxbCore : "org.glassfish.jaxb:jaxb-core:2.3.0.1",

И java 11 - этокомпилятор.

1 Ответ

0 голосов
/ 22 января 2019

Добавьте: , namespace = "http://www.loc.gov/zing/srw/"

к вашему @XmlRootElement:

 @XmlRootElement(name = "searchRetrieveResponse", namespace = "http://www.loc.gov/zing/srw/")

... это то, на что жалуется сообщение об ошибке: Несоответствие впространство имен!

unexpected element (uri:"http://www.loc.gov/zing/srw/", local:"searchRetrieveResponse").
Expected elements are <{}searchRetrieveResponse>

{} означает пустое ("") пространство имен, в данном случае.

Если namespace опустить, по умолчанию "##default" ...

Если значение равно "## default", то имя пространства имен XML , полученное из пакета класса (XmlSchema) . Если пакет безымянный, то пространство имен XML является пустым пространством имен по умолчанию.


РЕДАКТИРОВАТЬ:

В вашем сценарии я бы сгенерировалклассы с (встроенным) xjc (инструмент командной строки ... in ${java.home}/bin)

xjc -d generated <schema>

... где gnerated будет выходной папкой для классов (.java-файлов) и<schema> может быть файловым URL или (структурированным) каталогом (с вашими (только для чтения) xsd (s)).

После успешной генерации скопируйте содержимое сгенерированной в вашу "главную исходную папку", проверьте егов (используйте его) и изменяйте его только при изменении xsd.

...