2009-05-08 3 views
3

이 시나리오를 고려하십시오. 다음 데이터가 포함 된 person.xml이라는 XML 파일이 있습니다.XML 문서에서 동적으로 Java 클래스 생성

<person> 
    <name>MrFoo</name> 
    <age>28</age> 
</person> 

내가 자바 객체로이 XML을 읽고 싶다면, 내가로 (속성에 대한 게터/세터와) PersonBean라는 자바 빈을 만드는 것입니다 :

class Person{ 
    String name; 
    int age; 
} 

내가 사용할 수 XML을 읽고 Java Bean을 채우기위한 API.

하지만 실제 질문은 XML 파일의 구조가 변경된 경우입니다. 예를 들어 'email'이라는 새 속성이 XML 파일에 추가되면 새로운 속성을 추가하기 위해 Java Bean을 수정해야합니다. . 그러나 XML 구조가 변경 되더라도 Java 코드를 변경하지 않아야합니다.

그래서, 내가, 내가 같은 내용으로 PersonStructure.xml라는 또 다른 XML 파일 만드는거야 할 일은 노력하고있어 :

<class name="Person"> 
    <attributes> 
     <attribute> 
      <name>personName</name> 
      <type>java.lang.String</type> 
     </attribute> 
     ... and it goes like this... 
    </attribute> 
</class> 

하면은 PersonStructure.XML 파일을 읽고 변환 가능 그것은 Person.Java 클래스 파일에? 내가하려는 일은 맞습니까? 같은 것을하기위한 다른 방법이 있습니까?

+0

하나의 사소한 질문입니다. Java 코드가 새롭게 변경된 객체를 어떻게 처리합니까? 어쨌든 새 버전의 빈을 사용하기 위해 비즈니스 코드를 수정하지 않아도 될까요? –

+0

질문 제목이 정확합니까? 자바 클래스가 아니라 자바 객체를 생성하고자하는 것 같습니다. – skaffman

+0

XML 파일에서 자바 클래스 구조를 만들고 싶습니다. :) – Veera

답변

7

이것이 정확하게 수행하려는 것은 아니지만 JAXB를 살펴 봐야합니다. 스키마 정의에서 Java 클래스 세트를 생성 할 수 있습니다. PersonStructure.xml 파일은 구문이 다른 XSD처럼 보이기 때문에 JAXB를 재사용 할 수 있습니다. (나는 주로 .NET 사나이) 자바에 대해 잘 알고

https://jaxb.dev.java.net/

+0

JAXB http://xmlbeans.apache.org/와 거의 같은 XMLBeans를 사용할 수도 있습니다. – HaBaLeS

4

하지,하지만 상식이 적용됩니다 : 당신은 몇 가지 제어하는 ​​바인딩됩니다하지 않는 한 실제로 거의 사용 (동적으로 생성 된 콩에있다 이 경우 배열은 Object입니다.)

XSLT을 사용하여이 XML 정의에서 Java Bean을 코드 작성하는 것이 더 논리적입니다.

추신. XML에서 프로그래밍 언어를 만들지 마십시오. 네가 이렇게하면 지옥은 분명히 풀릴 것이다.

0

나는 (자바에서 POM.xml 파일로 데이터를 변환해야하는) 어떻게 든 똑같은 문제를 겪고 있습니다. 저에게 효과적이지 않았지만 아마도 당신을 위해 일할 수있는 것들 중 하나였습니다. XStream을 라이브러리, 그것은 XML로 자바 클래스를 변환, 당신은 살펴 보셔야합니다 :

http://x-stream.github.io/

을, 그냥 무작위 사람이 자신의 답을 어쨌든 그들에게 관련에서 오전 찾고. 이 라이브러리를 사용하는 방법에 대해 궁금한 점이 있으면 연락해보십시오. 문제가 해결되기를 바랍니다.

0

가능한 새로운 필드를 수용하기 때문에지도가 클래스보다 유용합니다.

이 대신에, 귀하의 예제를 사용하여 예시 하나 :

Person person = getPersonFromSomewhere(); 
System.out.printf("%s was %d years old\n", person.name, person.age); 
person.age++; // happy birthday! 

을 ...

Map<String, Object> person = getPersonFromSomewhere(); 
System.out.printf("%s was %d years old\n", person.get("name"), person.get("age")); 
int currentAge = (Integer) person.get("age"); // real code would sanitise the value first 
person.put("age", currentAge + 1); // happy birthday! 

예, 그것은 더 많은 코드와 적은 오류 (당신의 이름을 '잘못 입력 어떠한 유형 검사가 존재하지 않는 경우는 컴파일러가 당신을 말하지 않을 것이다) 확인을 의미하지만, 그것은 당신이 무엇을 할 것이다 : 당신은이 작업을 수행 할 것 필요. 그리고 모범 사례를 생각하면 getters와 setter를 멤버 필드에 직접 액세스하는 대신 코드 작성하는 것입니다. 실제로는 더 많은 코드를 작성하게 될 것입니다.

이 경로로 이동하려면 XML과 변환하는 방법은 this question을 참조하십시오.

관련 문제