파일과 함께 jaxb2-maven-plugin
을 사용할 수 있습니다.
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" jaxb:version="2.0">
<jaxb:bindings schemaLocation="odt.xsd">
<jaxb:bindings node="//xsd:element[@name='date']">
<jaxb:javaType name="java.time.OffsetDateTime"
parseMethod="xsd.test.OffsetDateTimeAdapter.parse"
printMethod="xsd.test.OffsetDateTimeAdapter.print" />
</jaxb:bindings>
<jaxb:schemaBindings>
<jaxb:package name="xsd.test" />
</jaxb:schemaBindings>
</jaxb:bindings>
</jaxb:bindings>
: 나는에서 그것에 변환
date
필드의 유형을 정의하는
jaxb-bindings.xjb
파일, 또한 클래스를 만든 다음
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="teste" type="Teste" />
<xsd:complexType name="Teste">
<xsd:sequence>
<xsd:element name="date" type="xsd:dateTime" minOccurs="1"
maxOccurs="1" nillable="false"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
:
은 우선은 odt.xsd
파일을 만든
이 파일은 OffsetDateTime
에서 String
으로 변환하는 xsd.test.OffsetDateTimeAdapter
클래스와 각각의 메서드를 참조하므로 작성했습니다 :
package xsd.test;
import java.time.OffsetDateTime;
public class OffsetDateTimeAdapter {
public static OffsetDateTime parse(String value) {
return OffsetDateTime.parse(value);
}
public static String print(OffsetDateTime value) {
return value.toString();
}
}
다음, pom.xml
에서 나는 플러그인에 대한 구성을 추가 한 :이
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<executions>
<execution>
<id>xjc</id>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- The package of your generated sources -->
<packageName>xsd.test</packageName>
<sources>
<source>src/main/resources/odt.xsd</source>
</sources>
<xjbSources>
<xjbSource>src/main/resources/jaxb-bindings.xjb</xjbSource>
</xjbSources>
</configuration>
</plugin>
을, 난 그냥 mvn clean package
와 함께 프로젝트를 구축했습니다과 만든 항아리는 xsd.test
에서 생성 된 파일이 포함되어 있습니다 꾸러미. 이에
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Teste", propOrder = {
"date"
})
public class Teste {
@XmlElement(required = true, type = String.class)
@XmlJavaTypeAdapter(Adapter1 .class)
@XmlSchemaType(name = "dateTime")
protected OffsetDateTime date;
// getter and setter
}
상기 date
필드 (내부 위에서 만든 xsd.test.OffsetDateTimeAdapter
클래스를 사용하는) 자동 생성 Adapter1
사용하여 OffsetDateTime
에 매핑되는 다음 Teste
클래스는 OffsetDateTime
로 date
필드를 포함한다. xml 형식에서 날짜를 파싱 예 :
ObjectFactory f = new ObjectFactory();
JAXBContext context = JAXBContext.newInstance("xsd.test");
Unmarshaller unmarshaller = context.createUnmarshaller();
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><ns2:teste xmlns:ns2=\"xsd.test\"><date>2016-01-01T00:00+01:00</date></ns2:teste>";
JAXBElement<Teste> jaxElement = unmarshaller.unmarshal(new StreamSource(new ByteArrayInputStream(xml.getBytes())), Teste.class);
OffsetDateTime odt = jaxElement.getValue().getDate();
System.out.println(odt); // 2016-01-01T00:00+01:00
그리고 XML로 날 마샬링하면 OffsetDateTime
는 직접 String
같은 2016-01-01T00:00+01:00
등으로 변환된다. xsd.test
패키지에
xjc src/main/resources/odt.xsd -d src/main/java/ -p xsd.test -b src/main/resources/jaxb-bindings.xjb
이, src/main/java
디렉토리의 클래스를 생성합니다
또 다른 방법은 JDK와 함께 제공되는 명령 줄 xjc
을 사용하는 것입니다.
고맙습니다. 단점은 단지'xjb :'의 모든'xsd : dateTime' 요소를 열거해야한다는 것입니다. 그러나 그것은 사소한 부분입니다. –
@LustigerAstronaut 도와 주셔서 감사합니다.어쩌면 당신은 바인딩을'node = "// xsd : element [@ type = 'xsd : dateTime']"'(필자는 테스트하지 않았다) –