Альтернативным подходом будет использование StAX StreamReaderDelegate
для манипулирования текстом XML до его получения реализацией JAXB.
Демо
Ваш код будет выглядеть примерно так: Вы бы реализовали StreamReaderDelegate
для управления текстом, возвращаемым из текстовых событий:
package forum7329881;
import java.io.FileInputStream;
import javax.xml.bind.*;
import javax.xml.stream.*;
import javax.xml.stream.util.StreamReaderDelegate;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Customer.class);
XMLInputFactory xif = XMLInputFactory.newInstance();
XMLStreamReader xsr = xif.createXMLStreamReader(new FileInputStream("src/forum7329881/input.xml"));
xsr = new MyStreamReaderDelegate(xsr);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Customer customer = (Customer) unmarshaller.unmarshal(xsr);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(customer, System.out);
}
private static class MyStreamReaderDelegate extends StreamReaderDelegate {
public MyStreamReaderDelegate(XMLStreamReader xsr) {
super(xsr);
}
@Override
public String getText() {
return super.getText().trim();
}
@Override
public char[] getTextCharacters() {
return getText().toCharArray();
}
@Override
public int getTextLength() {
return getText().length();
}
@Override
public int getTextStart() {
return 0;
}
}
}
Input.xml
Ниже приведен пример ввода, который содержит пробелы в текстовых узлах:
<customer Id="1">
<name> Jane Doe </name>
<address>
<street> 123 A Street </street>
</address>
</customer>
выход
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer>
<address>
<street>123 A Street A</street>
</address>
<name>Jane Doe</name>
</customer>
Клиент
package forum7329881;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Customer {
private String name;
private Address address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
Адрес
package forum7329881;
public class Address {
private String street;
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
}
Для получения дополнительной информации
Ниже приведена ссылка на более подробный пример, где я использовал StAX StreamReaderDelegate
для поддержки демаршаллинга без учета регистра: