Поиск схемы из сообщения XML, генерация класса и десериализация в JAVA из XML - PullRequest
0 голосов
/ 27 января 2020

Я довольно новичок с JAVA и столкнулся с очень специфической c проблемой:

У меня есть веб-сервис, который регулярно возвращает XML сообщений. Я хочу иметь возможность десериализовать это сообщение в JAVA объект, но я не знаю, как двигаться дальше ...

Это базовое c xml сообщение, которое я получаю:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ds:tfmDataService
  xmlns:ds="urn:us:gov:dot:faa:atm:tfm:tfmdataservice"
  xmlns="urn:us:gov:dot:faa:atm:tfm:tfmdataservice"
  xmlns:fdm="urn:us:gov:dot:faa:atm:tfm:flightdata"
  xmlns:nxce="urn:us:gov:dot:faa:atm:tfm:tfmdatacoreelements"
  xmlns:nxcm="urn:us:gov:dot:faa:atm:tfm:flightdatacommonmessages"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:us:gov:dot:faa:atm:tfm:tfmdataservice TFMData_Service.xsd">
  <fltdOutput>
    <fdm:fltdMessage acid="UAL1252" airline="UAL" arrArpt="KIAH" cdmPart="true" depArpt="KSAT" fdTrigger="FD_FLIGHT_MODIFY_MSG" flightRef="125539563" msgType="FlightModify" sensitivity="A" sourceFacility="UAL" sourceTimeStamp="2020-01-27T09:32:11Z">
      <fdm:ncsmFlightModify>
        <nxcm:qualifiedAircraftId>
          <nxce:aircraftId>UAL1252</nxce:aircraftId>
          <nxce:computerId>
            <nxce:facilityIdentifier>UAL</nxce:facilityIdentifier>
          </nxce:computerId>
          <nxce:igtd>2020-01-27T23:30:00Z</nxce:igtd>
          <nxce:departurePoint>
            <nxce:airport>KSAT</nxce:airport>
          </nxce:departurePoint>
          <nxce:arrivalPoint>
            <nxce:airport>KIAH</nxce:airport>
          </nxce:arrivalPoint>
        </nxcm:qualifiedAircraftId>
        <nxcm:airlineData>
          <nxcm:flightStatusAndSpec>
            <nxcm:flightStatus>FILED</nxcm:flightStatus>
            <nxcm:aircraftModel>B739</nxcm:aircraftModel>
            <nxcm:aircraftspecification aircraftEngineClass="JET" numberOfAircraft="1">B739</nxcm:aircraftspecification>
          </nxcm:flightStatusAndSpec>
          <nxcm:eta etaType="SCHEDULED" timeValue="2020-01-28T00:28:00Z"/>
          <nxcm:etd etdType="SCHEDULED" timeValue="2020-01-27T23:42:00Z"/>
          <nxcm:flightTimeData airlineInTime="2020-01-28T00:37:00Z" airlineOffTime="2020-01-27T23:42:00Z" airlineOnTime="2020-01-28T00:28:00Z" airlineOutTime="2020-01-27T23:30:00Z" flightCreation="2020-01-26T23:30:38Z" originalArrival="2020-01-28T00:28:00Z" originalDeparture="2020-01-27T23:42:00Z"/>
          <nxcm:diversionIndicator>NO_DIVERSION</nxcm:diversionIndicator>
          <nxcm:rvsmData currentCompliance="true" equipped="true" futureCompliance="true"/>
          <nxcm:arrivalFixAndTime arrTime="2020-01-28T00:03:10Z" fixName="GMANN"/>
        </nxcm:airlineData>
      </fdm:ncsmFlightModify>
    </fdm:fltdMessage>
  </fltdOutput>
</ds:tfmDataService>

Итак, сначала я не понимаю, как мне найти местоположение схемы, так как адрес - это urn: us: gov: dot: faa: atm: tfm: tfmdataservice TFMData_Service.xsd

Я понятия не имею, как получить это описание схемы, поскольку этот адрес не похож на http-адрес, и поэтому я не могу извлечь описание схемы, поскольку не знаю, где его скачать.

Я понял, что мне нужна эта схема для генерации моего java класса, который будет использоваться для десериализации сообщения в JAVA объект. Можно ли генерировать объект на лету при получении такого типа сообщений или мне действительно нужно сначала создать классы для десериализации моих сообщений?

Тогда, если я смогу получить xsd, описывающий любое полученное сообщение xml, как я должен сгенерировать код, необходимый для десериализации данных? Как это работает ? Существуют ли специальные c инструменты для этого?

Заранее спасибо!

1 Ответ

0 голосов
/ 28 января 2020

Итак, сначала я не понимаю, как мне найти местоположение схемы, так как адрес - это urn: us: gov: dot: faa: atm: tfm: tfmdataservice TFMData_Service.xsd

Я понятия не имею, как получить это описание схемы, поскольку этот адрес не похож на http-адрес, и поэтому я не могу извлечь описание схемы, так как не знаю, где его скачать.

Не все схемы находятся в домене publi c. Часто вам необходимо зарегистрироваться в организации поставщика, прежде чем вы сможете получить схемы и / или спецификации API.

Я понял, что мне нужна эта схема, чтобы сгенерировать мой класс java, который будет использоваться для десериализации сообщения в JAVA объект. Можно ли генерировать объект на лету при получении такого типа сообщений или мне действительно нужно сначала создать классы для десериализации моих сообщений?

Java может анализировать XML без использования схемы, но я не рекомендую это для этого сценария (получение данных из правительственного API). Если есть доступная схема - и я был бы очень удивлен, если нет - тогда вы должны использовать ее. Это упростит ваш код Java, и вы также сможете проверить схему при синтаксическом анализе.

Тогда, если я смогу получить xsd, описывающий любое полученное сообщение xml, Как я должен генерировать код, необходимый для десериализации данных? Как это работает ? Существуют ли специальные c инструменты для этого?

На этот вопрос легко ответить, используя вашу любимую поисковую систему. Поиск 'JAXB'.

...