[java] .XSD 파일에서 Java 클래스 생성…?

QuickBooks에서 보내거나받을 수있는 XML 요청 / 응답을 정의하는 거대한 QuickBooks SDK .XSD 스키마 파일이 있습니다.

이 .XSD 파일에서 Java 클래스를 쉽게 생성 할 수 있기를 원합니다. 그런 다음 XML을 Java 객체로, Java 객체를 XML로 마샬링하는 데 사용할 수 있습니다.

이 작업을 수행하는 쉬운 방법이 있습니까?

이상적으로는 런타임시 기본 Java 배포 외부에 라이브러리가 필요하지 않습니다. 그러나 나는 유연합니다 …



답변

JAXB 는 원하는 것을 정확하게 수행합니다. 1.6부터 JRE / JDK에 내장


답변

위의 “JAXB 사용”주석을 확장하려면

Windows에서
"%java_home%\bin\xjc" -p [your namespace] [xsd_file].xsd

예를 들어
"%java_home%\bin\xjc" -p com.mycompany.quickbooks.obj quickbooks.xsd

조금만 기다리십시오. 잘 구성된 XSD 파일이 있으면 잘 구성된 Java 클래스를 얻게됩니다.


답변

5 분 이내에 Java에서 XML로, XML에서 Java로 코딩을 시작하려면 단순 XML 직렬화를 시도하십시오. JAXB API를 배우는 데 시간을 소비하지 마십시오
http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php

그러나 JAXB를 배우는 데 관심이 있다면 훌륭한 자습서가 있습니다.
http://blogs.oracle.com/teera/entry/jaxb_for_simple_java_xml

튜토리얼의 내용 :

간단한 Java-XML 직렬화를위한 JAXB

Java에서 XML 직렬화를 수행하는 여러 가지 방법이 있습니다. 구문 분석 및 직렬화를 세밀하게 제어하려면 SAX, DOM 또는 Stax를 사용하여 성능을 향상시킬 수 있습니다. 그러나 내가 자주하고 싶은 일은 POJO와 XML 간의 간단한 매핑입니다. 그러나 수동으로 XML 이벤트 구문 분석을 수행하기 위해 Java 클래스를 작성하는 것은 쉽지 않습니다. 최근에 JAXB가 빠르고 편리한 Java-XML 매핑 또는 직렬화라는 것을 알았습니다.

JAXB에는 유용한 기능이 많이 있으며 여기에서 참조 구현을 확인할 수 있습니다. Kohsuke의 블로그 는 JAXB에 대해 더 자세히 배울 수있는 좋은 자료입니다. 이 블로그 항목에서는 JAXB를 사용하여 간단한 Java-XML 직렬화를 수행하는 방법을 보여줍니다.

POJO에서 XML로

Item Java 객체가 있다고 가정 해 봅시다. Item 객체를 XML 형식으로 직렬화하고 싶습니다. 먼저해야 할 일은 javax.xml.bind.annotation. * 패키지의 XML 주석으로이 POJO에 주석을 달아야합니다. Item.java에 대한 코드 목록 1을 참조하십시오.

코드에서

  • @XmlRootElement(name="Item") 내가 루트 요소가되고 싶다는 것을 나타냅니다.
  • @XmlType(propOrder = {"name", "price"}) 요소를 XML 출력으로 정렬하려는 순서를 나타냅니다.
  • @XmlAttribute(name="id", ...) id가 루트 요소의 속성임을 나타냅니다.
  • @XmlElement(....) 가격과 이름이 Item의 요소가 되길 원한다는 것을 나타냅니다.

Item.java준비가되었습니다. 그런 다음 Item 마샬링을위한 JAXB 스크립트를 작성할 수 있습니다.

//creating Item data object
Item item = new Item();
item.setId(2);
item.setName("Foo");
item.setPrice(200);
.....

JAXBContext context = JAXBContext.newInstance(item.getClass());
Marshaller marshaller = context.createMarshaller();
//I want to save the output file to item.xml
marshaller.marshal(item, new FileWriter("item.xml"));

전체 코드 목록은 코드 목록 2를 참조하십시오 main.java. 출력 코드 목록 3 item.xml파일이 작성됩니다. 다음과 같이 보입니다 :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:item ns1:id="2" xmlns:ns1="http://blogs.sun.com/teera/ns/item">

 <ns1:itemName>Foo</ns1:itemName>
<ns1:price>200</ns1:price>

</ns1:item>

쉬운가요? 또는 단순히 marshal (…) 메소드의 매개 변수를 변경하여 출력 XML을 텍스트 문자열, 스트림, 작성기, ContentHandler 등으로 채널링 할 수 있습니다.

...
JAXBContext context = JAXBContext.newInstance(item.getClass());
Marshaller marshaller = context.createMarshaller();
// save xml output to the OutputStream instance
marshaller.marshal(item, <java.io.OutputStream instance>);

...
JAXBContext context = JAXBContext.newInstance(item.getClass());
Marshaller marshaller = context.createMarshaller();
StringWriter sw = new StringWriter();
//save to StringWriter, you can then call sw.toString() to get java.lang.String
marshaller.marshal(item, sw);

XML에서 POJO로

과정을 반대로하자. 이제 XML 문자열 데이터 조각이 있고이를 Item.java 객체로 변환하려고한다고 가정합니다. XML 데이터 (코드 목록 3)는 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:item ns1:id="2" xmlns:ns1="http://blogs.sun.com/teera/ns/item">
<ns1:itemName>Bar</ns1:itemName>
<ns1:price>80</ns1:price>
</ns1:item>

그런 다음이 XML 코드를 Item 객체에 정렬 해제 할 수 있습니다

...
ByteArrayInputStream xmlContentBytes = new ByteArrayInputStream (xmlContent.getBytes());
JAXBContext context = JAXBContext.newInstance(Item.getClass());
Unmarshaller unmarshaller = context.createUnmarshaller();
//note: setting schema to null will turn validator off
unmarshaller.setSchema(null);
Object xmlObject = Item.getClass().cast(unmarshaller.unmarshal(xmlContentBytes));
return xmlObject;
...

전체 코드 목록은 코드 목록 2 (main.java)를 참조하십시오. XML 소스는 스트림과 파일 모두에서 여러 형태로 제공 될 수 있습니다. 유일한 차이점은 메소드 매개 변수입니다.

...
unmarshaller.unmarshal(new File("Item.xml")); // reading from file
...
// inputStream is an instance of java.io.InputStream, reading from stream
unmarshaller.unmarshal(inputStream);

XML 스키마를 사용한 유효성 검사

마지막으로 언급하고자하는 것은 Java 객체를 비 정렬 화하기 전에 스키마로 입력 XML의 유효성을 검사하는 것입니다. item.xsd라는 XML 스키마 파일을 만듭니다. 전체 코드 목록은 코드 목록 4 (Item.xsd)를 참조하십시오. 이제 내가해야 할 일은 유효성 검사를 위해이 스키마를 등록하는 것입니다.

...
Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
.newSchema(new File("Item.xsd"));
unmarshaller.setSchema(schema); //register item.xsd shcema for validation
...

XML 데이터를 POJO로 비 정렬 화하려고 할 때 입력 XML이 스키마를 준수하지 않으면 예외가 발생합니다. 전체 코드 목록은 코드 목록 5 (invalid_item.xml)를 참조하십시오.

javax.xml.bind.UnmarshalException
- with linked exception:
javax.xml.bind.JAXBException caught: null
[org.xml.sax.SAXParseException: cvc-datatype-valid.1.2.1: 'item1' is
                                not a valid value for 'integer'.]

여기서는 ‘id’속성을 정수 대신 문자열로 변경합니다.

XML 입력이 스키마에 대해 유효한 경우 XML 데이터는 Item.java 오브젝트에 성공적으로 비 정렬 화됩니다.


답변

Eclipse IDE 사용 :-

  1. xsd를 새로운 기존 프로젝트에 복사하십시오.
  2. 클래스 경로에 JAXB 필수 JAR이 있는지 확인하십시오. 여기에서 다운로드 할 수 있습니다 .
  3. XSD 파일-> 생성-> JAXB 클래스를 마우스 오른쪽 단추로 클릭하십시오.

답변

가장 쉬운 방법은 명령 줄을 사용하는 것입니다. .xsd 파일의 디렉토리를 입력하십시오.

xjc myFile.xsd.

따라서 java는 모든 Pojo를 생성합니다.


답변

Maven을 목적으로 사용할 수 있으므로 일부 종속성을 추가하고 응용 프로그램을 정리해야합니다. 대상 폴더에 모든 클래스가 자동으로 생성됩니다.

대상에서 원하는 위치로 복사하십시오 .xsd 파일에서 클래스를 만드는 데 사용한 pom.xml이 있습니다.

    <plugin>
     <groupId>org.codehaus.mojo</groupId>
     <artifactId>jaxb2-maven-plugin</artifactId>

     <executions>
      <execution>
       <goals>
        <goal>xjc</goal>
       </goals>
      </execution>
     </executions>
     <configuration>
      <schemaDirectory>src/main/webapp/schemas/</schemaDirectory>
     </configuration>
    </plugin>

   </plugins>
  </pluginManagement>
 </build>
</project>

xsd 파일을 “src / main / webapp / schemas /”아래에 놓으면 maven이 컴파일시에 찾을 수 있습니다.

이것이 도움이되기를 바랍니다. 더 자세한 정보는 http://www.beingjavaguys.com/2013/04/create-spring-web-services-using-maven.html 에서 찾을 수 있습니다

그것이 도움이되기를 바랍니다 🙂


답변

XMLBeans 가 할 것입니다. 특히 “scomp”명령

편집 : XMLBeans가 폐기 되었습니다 . 자세한 내용은 이 stackoverflow 게시물 을 확인하십시오 .