.X에서 Java 클래스 생성SD 파일...?
QuickBooks SDK .XSD 스키마 파일을 가지고 있습니다.XSD 스키마 파일에는 QuickBooks에서 송수신할 수 있는 XML 요청/응답이 정의되어 있습니다.
이 .X에서 Java 클래스를 쉽게 생성할 수 있으면 좋겠습니다.SD 파일은 XML에서 Java 개체로, Java 개체에서 XML로 정렬하는 데 사용할 수 있습니다.
쉬운 방법은 없을까?
실행 시 기본 Java distro 외부에 라이브러리가 필요하지 않은 것이 이상적입니다.하지만 난 유연해...
위의 "JAXB 사용" 코멘트를 자세히 설명하려면
Windows 의 경우"%java_home%\bin\xjc" -p [your namespace] [xsd_file].xsd
예.,"%java_home%\bin\xjc" -p com.mycompany.quickbooks.obj quickbooks.xsd
잠시 기다려 주십시오. 만약 당신이 제대로 된 XSD 파일을 가지고 있다면, 당신은 제대로 된 자바 클래스를 얻을 수 있을 것입니다.
JAXB는 당신이 원하는 대로 합니다.1.6부터 JRE/JDK에 내장되어 있습니다.
5분 이내에 Java에서 XML로, XML에서 Java로 코드화를 시작하려면 Simple XML Serialization을 사용해 보십시오.JAXB API를 배우는 데 시간을 낭비하지 마십시오.http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php
하지만 JAXB를 정말 배우고 싶다면, 여기 훌륭한 튜토리얼이 있습니다.http://blogs.oracle.com/teera/entry/jaxb_for_simple_java_xml
튜토리얼 내용:
JAXB를 통한 간단한 Java-XML 시리얼라이제이션
Java에서 XML 직렬화를 수행하는 방법은 여러 가지가 있습니다.해석과 시리얼화를 세밀하게 제어하려면 SAX, DOM 또는 Stax를 선택하면 성능이 향상됩니다.다만, POJO와 XML의 간단한 매핑을 자주 실시하고 싶습니다만, 수동으로 XML 이벤트 해석을 실시하는 Java 클래스를 작성하는 것은 간단한 일이 아닙니다.JAXB는 빠르고 편리한 Java-XML 매핑 또는 시리얼라이제이션이라는 것을 최근에 알게 되었습니다.
JAXB에는 많은 유용한 기능이 포함되어 있습니다.여기서 레퍼런스 구현을 확인하실 수 있습니다.Kohsuke's Blog도 JAXB에 대해 자세히 알 수 있는 좋은 자료입니다.이 블로그 엔트리에 대해서는 JAXB를 사용한 간단한 Java-XML 시리얼라이제이션 방법을 나타냅니다.
POJO에서 XML로
예를 들어 Item Java 객체가 있다고 합시다.Item 개체를 XML 형식으로 직렬화하려고 합니다.먼저 이 POJO에 javax.xml.bind.annotation에서 XML 주석을 몇 개 붙여야 합니다.* 패키지Item.java에 대해서는 코드 리스트1을 참조해 주세요.
코드에서
@XmlRootElement(name="Item")
이치@XmlType(propOrder = {"name", "price"})
요소를 XML 출력으로 배열하는 순서를 나타냅니다.@XmlAttribute(name="id", ...)
가 root.@XmlElement(....)
가격 및 이름을 항목 내 요소로 지정함을 나타냅니다.
★★★Item.java
준비되었습니다.그런 다음 아이템을 마샬링하기 위한 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"));
의 상세한 것에 는, 「Code 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>
쉽죠?또는 출력 XML을 텍스트 문자열, 스트림, 라이터, 컨텐츠 핸들러 등으로 채널링할 수 있습니다.이것은 다음과 같이 marshal(...) 메서드의 파라미터를 변경하는 것 뿐입니다.
...
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 소스는 Stream과 file에서 모두 다양한 형태로 제공됩니다.유일한 차이점은 메서드 파라미터입니다.
...
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에 Marshal 해제하려고 하면 입력 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 사용:-
- xsd를 새 프로젝트 또는 기존 프로젝트에 복사합니다.
- 클래스 패스에 JAXB 필수 JAR이 있는지 확인합니다.여기서 다운받으실 수 있습니다.
- XSD 파일 -> 생성 -> JAXB 클래스를 오른쪽 클릭합니다.
가장 쉬운 방법은 명령줄을 사용하는 것입니다..xsd 파일의 디렉토리에 입력하기만 하면 됩니다.
xjc myFile.xsd.
자바는 모든 Pojos를 생성합니다.
Maven을 목적에 사용할 수 있습니다. 종속성을 추가하고 애플리케이션을 삭제하기만 하면 됩니다.대상 폴더에 모든 클래스가 자동으로 생성됩니다.
.pom.xml
때 것 중 하나야xsd
삭제:
<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>
xsd 파일을 다음 위치에 놓기만 하면 됩니다.src/main/webapp/schemas/
이이이컴컴컴컴컴컴컴찾찾찾
XMLBeans가 합니다.구체적으로는 "scomp" 명령어입니다.
편집: XMLBeans가 폐기되었습니다.자세한 것에 대하여는, 이 스택 오버 플로우 투고를 확인해 주세요.
은 " " " 입니다.%java_home%\bin\xjc -p [your namespace] [xsd_file].xsd
.
여기서 리버스 엔지니어링을 할 수 있는 옵션이 있는지 여부도 묻고 싶습니다.만약 그렇다면 pojo 클래스에서 xsd를 생성할 수 있습니까?
외부 라이브러리를 사용해도 괜찮으시다면 예전에 Castor를 사용해 본 적이 있습니다.
JAXB 제한.
JAXB는 XML 오브젝트와 Java 오브젝트 간의 데이터를 처리하는 좋은 방법이라고 생각합니다.긍정적인 측면은 실행 시 데이터에 대한 제어와 성능 면에서 더 우수하다는 것이 장점입니다.빌드 툴이나 스크립트를 적절히 사용하면 코딩 작업이 많이 필요하지 않습니다.
구성 부분이 바로 작업이 아니라는 것을 알게 되었고 개발 환경 설정을 위해 몇 시간을 소비했습니다.
하지만 제가 직면한 어리석은 한계 때문에 이 솔루션을 포기했습니다.XML Schema Definition(XSD)에는 "value"라는 이름의 Atribute/Element가 있으며 XSD를 그대로 사용해야 합니다.이 매우 작은 제약으로 인해 바인딩 단계 XJC가 "Property 'Value'가 이미 사용됨" 오류로 인해 실패했습니다.
이는 JAXB 구현으로 인해 바인딩 프로세스는 각 클래스에 소수의 속성을 추가하고 그 중 하나가 값 속성이 됨으로써 XSD에서 Java 개체를 생성하려고 합니다.XSD를 처리했을 때 이미 해당 이름의 속성이 있다고 불평했습니다.
JAXB의 XJC가 이에 대한 답이 될 수 있지 않나요?나도 같은 일을 이루려고 노력 중이야.하지만 아직 "시도 중" 단계입니다.우연히 XJC를 발견해서 공유할 생각을 했어요.
유명한 JAXB
원하는 빌드 단계에서 이를 수행할 수 있는 메이븐 플러그인이 있습니다.
이 작업은 xsd <-> Java 두 가지 방법으로 수행할 수 있습니다.
JAXB 제한에 대해 말하자면, 다른 속성에 대해 같은 이름을 가지는 경우의 해결책은 xsd에 인라인 jaxb 커스터마이즈를 추가하는 것입니다.
+
. . 바인딩 선언 .
또는 외부 사용자 지정...
상세한 것에 대하여는, http://jaxb.java.net/tutorial/section_5_3-Overriding-Names.html 를 참조해 주세요.
언급URL : https://stackoverflow.com/questions/686453/generate-java-classes-from-xsd-files
'source' 카테고리의 다른 글
스프링 데이터 jpa hibernate mariadb timestamp fractional seconds가 삽입될 때 잘리는 이유는 무엇입니까? (0) | 2022.09.04 |
---|---|
WAIT와 BLOCKED 스레드 상태의 차이 (0) | 2022.09.04 |
C에서 GUI 프로그래밍을 하려면 어떻게 해야 하나요? (0) | 2022.09.03 |
Java에 힙이 있나요? (0) | 2022.09.03 |
Vue JS에서 구성 요소를 동적으로 렌더링하는 방법 (0) | 2022.09.03 |