Генерация XML JAXB

#java #xml #jaxb

Вопрос:

Я хочу знать, как я могу сгенерировать следующее с помощью JAXB.

Основная проблема — наличие двух пространств имен в soapenv. Когда я создаю xml, а затем добавляю soap env, он добавляет пробелы в именах в разных строках. Это не то, чего я хочу

Проблема 2 — вместо xmlsn=»…» Я хочу xmlns:SOME_TEXT=»…», как показано ниже

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:fis="http://fis.certegy.cka.com/">
<soapenv:Body>
 <fis:InquiryRequest>
 <Version>1.0</Version>
 <RequestUID>191919191919191</RequestUID>
 <Station>1078686704</Station>
 <TranType>40</TranType>
 <Consumer>
 <FirstName>Susie</FirstName>
 <LastName>Smith</LastName>
 <Address>
 <Line1>100 59th</Line1>
 <Line2>Ave NE</Line2>
 <City>New York</City>
 <State>NY</State>
 <Zip>10021</Zip>
 </Address>
 <Phone>1114589658</Phone>
 <EmailAddress>Your.Email@yahoo.com</EmailAddress>
 <DateOfBirth>1960-01-01</DateOfBirth>
 <ID>
 <Type>NY</Type>
 <Value>285756967</Value>
 </ID>
 <DeviceID>12345678000</DeviceID>
 <DaysOfEmployment>9991</DaysOfEmployment>
 <PayDate>2019-05-03</PayDate>
 <PayFrequency>Weekly</PayFrequency>
 </Consumer>
 <Amount>70.00</Amount>
 <CashBack>0</CashBack>
 <GiftCard>0</GiftCard>
 <Check>
 <Micr>
 <ExpansionType>1002</ExpansionType>
 <Line>T861000016A100002106C</Line>
 <Swiped>false</Swiped>
 </Micr>
 <Type>P</Type>
 </Check>
 </fis:InquiryRequest>
 </soapenv:Body>
</soapenv:Envelope>
 

Ответ №1:

Пожалуйста, обратите внимание: я использую EclipseLink MOXY приложение, которое является расширением JAXB и предоставляет множество дополнительных преимуществ по сравнению с обычным JAXB . Приведенный ниже ответ основан на MOXY том, что я не уверен, сработает ли он даже для Standard JAXB .

Я не уверен, правильно ли я понял вашу проблему 1. Исходя из моего понимания, когда вы решите эту problem-2 проблему, я предполагаю, что это должно решить и это. Так как это добавит все пространства имен в заголовок XML в вашем случае soapenv:Envelope .

Что касается вашей проблемы 2: Если вы хотите получить пользовательский prefix для себя namespace URI , вы можете создать Map<String, String> файл с вашим prefix и namespace и передать его во marshaling время, чтобы moxy он автоматически обрабатывал и предоставлял prefix заголовок to ( xmlns ) и ваш XML node .

 Map<String, String> namespaces = new HashMap<String, String>();
namespaces.put("http://schemas.xmlsoap.org/soap/envelope/", "soapenv");
namespaces.put("http://fis.certegy.cka.com/", "fis");
namespaces.put("Whatever your namespace", "SOME_TEXT");
jsonMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
jsonMarshaller.setProperty(MarshallerProperties.NAMESPACE_PREFIX_MAPPER, namespaces);
jsonUnmarshaller.setProperty(UnmarshallerProperties.JSON_NAMESPACE_PREFIX_MAPPER, namespaces);

 

Справочная документация

Код на GitHub