2011-04-10 5 views
3

저는 현재 자바와 XML 데이터를 다루는 방법을 배우고 있습니다. 나는 Java SAX를 사용하여 XML 데이터를 Java 객체로 구문 분석하는 방법을 배웠다.이 XML 문서는 변경되어 추가 된 자식을 추가 할 수있다 (예 : 생일, 높이 ...). 그렇다면이 XML 문서를 처리하는 가장 좋은 방법은 무엇입니까? 나는이 같은 개체를 사용 들었다 :각 XML 하위 노드에 대해 Java 객체를 동적으로 생성 하시겠습니까?

Object1.ID 
Object1.Emp_Id 
Object1.Emp_Name 
... 
Object2.ID 
Object2.Emp_Id 
Object2.Emp_Name 

는 XML 생일과 같은 새로운 아이를받은 경우, 응용 프로그램은 같은 객체에 추가합니다 :

Object1.ID 
Object1.Emp_Id 
Object1.Emp_Name 
Object1.Birthday 

누군가가 날 지점 수 위의 예와 같이 새로운 노드를 동적으로 생성 할 수있는 올바른 방향으로 자식 노드를 놓을 수 있습니까? 자식 노드를 변경하려면 직접 지정하지 않아도됩니까? 멍청한 녀석 얘기에 대해 유감스럽게도, 나는이 권리에 대해 설명하고 있는지 확신 할 수 없다. SAX를 배우고 자습서를 찾았지만 원하는 것을 설명하지 못했습니다. Mapping XML to Java Objects

감사합니다!

XML 파일 :

<?xml version = "1.0" ?> 
<Employee-Detail> 

<Employee> 
<ID no="1"> 
<Emp_Id> E-001 </Emp_Id> 
<Emp_Name> Vinod </Emp_Name> 
<Emp_E-mail> [email protected].com </Emp_E-mail> 
<Sex>Male</Sex> 
<Age>25</Age> 
</ID> 
</Employee> 

<Employee> 
<ID no="2"> 
<Emp_Id> E-002 </Emp_Id> 
<Emp_Name> Amit </Emp_Name> 
<Emp_E-mail> [email protected] </Emp_E-mail> 
<Sex>Male</Sex> 
<Age>21</Age> 
</ID> 
</Employee> 
</Employee-Detail> 

답변

0

은 기본적으로이 작업을 수행하는 방법은 두 가지가 있습니다. 먼저 이름이 XML 요소에 매핑되는 Java 클래스를 정의 할 수 있습니다. 수작업으로 할 수도 있고 XmlBeans과 같은 도구를 사용할 수도 있습니다 (많은 도구가 있습니다). 둘 다 같습니다. 미리 XML에 대해 알아야합니다.

다른 방법은 전용 클래스를 사용하는 것이 아니라 "이름"속성, 속성 맵 및 하위 목록이있는 일종의 일반적인 "트리 노드"개체를 사용하는 것입니다. DOM (Document Object Model)은 표준 버전이며 실제로이 트리를 자동으로 작성하는 DOM 파서를 사용하는 것이 SAX를 사용하는 표준 대안입니다. 자신 만의 generic 요소 클래스를 만들 수도 있지만 DOM을 먼저 사용하여 응용 프로그램에서 어떻게 작동하는지 확인해야합니다.

+1

JAXB가 빛나는 곳이 아닌가요? –

+0

입력 해 주셔서 감사합니다. 구성 요소가 어떻게 구성되는지, 내가 해결하려고하는 자식 노드 만 알게 될 것입니다. 하위 노드 이름은 사용자가 작성하기 때문에 다를 수 있지만 응용 프로그램이 응용 프로그램을 탐색하는 데 도움이되도록 모든 상위 노드가 동일합니다. –

4

저는 개인적으로 JAXB를 사용하는 것을 정말로 즐깁니다.

샘플 XML을 가져 와서 XML 스키마 (XSD) 생성기로 전달할 수 있습니다. 그런 다음 XSD를 사용하여 XJC 도구를 사용하여 Java 객체를 생성하십시오.

Java 객체가 생성되면 Marshaller 및 Unmarshaller 클래스를 각각 사용하여 XML을 마샬링 (저장/내보내기/쓰기)하거나 비 정렬 (로드/가져 오기/읽기) 할 수 있습니다.

http://www.flame-ware.com/products/xml-2-xsd/에는 온라인 XML-XSD 변환기가 사용되었지만 현재는 다운 된 것으로 보입니다. Visual Studio의 Express 버전을 무료로 다운로드 할 수도 있습니다.

나는 JAXB이 자습서를 좋아한다 : http://download.oracle.com/javaee/5/tutorial/doc/bnbah.html

내가 구문 분석있어 같은 (지금까지 거의) 구문 분석하지 모든 일을 완벽하게 제어하려는 경우 나는 보통 SAX 만 구문 분석을 사용합니다.

DOM 메소드를 사용하는 것이 즐겁지 않습니다. 실제로 XML 문서를 처리하기 전에 전체 XML 문서를 구문 분석해야하고 구문 분석이 끝나면 파서/XML 소비자를 구성하기 위해 더 많은 작업을 수행해야합니다. 필드가 실제로 무엇을 할 것인지 알 수 있습니다.

동적 인 자녀는 키 - 값 쌍을 나타내는 개체를 캡슐화되지 않은 숫자로 스키마에 포함하기 만하면됩니다.생성 된 모든 코드로 인해 시간이 절약됩니다.

XmlBeans 라이브러리는 JAXB와 비슷하지만 XmlBeans가없는 동안 Java의 코어 릴리스에 포함되었으므로 후자를 선호합니다.

+0

질문 : 중첩 된 벡터를 JAXB 또는 SAX와 함께 사용할 수 있습니까? 나는 방금 벡터가 무엇이든 명명 될 수 있고 각 벡터 객체에 대해 무엇이든 저장할 수 있다는 것을 알았습니다. (내가 올바르게 설명하고 있는지 확실하지 않음). 예 : 하나의 XML 요소 상위 이름을 보유 할 하나의 벡터 변수를 만듭니다. 그 벡터 변수 내에서 나는 그 부모 안에있는 모든 아이들을위한 다른 벡터를 만든다. 그래서 Object1.child1, Object1.child2, Object1.child3 ... 등을 얻을 수 있습니다. –

+0

JAXB를 사용하면 객체에서 시작할 수도 있습니다. 즉, 스키마가 필요하지 않습니다. 또한 Java는 여러 구현 (Metro, EclipseLink MOXy, Apache JaxMe)을 사용하는 표준 (JSR-222)이기 때문에 Java SE 6에 포함되어 있습니다.이 표준의 개발에는 XMLBeans의 대표뿐만 아니라 다른 객체 XML 도구. –

+0

JAXB는 기본적으로 키 값 쌍의 맵을 지원합니다. 그래서 예, 당신은 둥지 =). XMLAdapter를 살펴보십시오. 또한, 좋은 추가, Blaise! –

1

또 다른 옵션은 XStream : http://x-stream.github.io/입니다. JAXB보다 유연성이 떨어지지 만, 많은 설정이 필요하지 않다는 장점이 있습니다.

는 귀하의 경우에는 그냥 클래스를 만들 것입니다 : 당신의 XML이 객체에 정상적으로지도하지 않는 경우

public class Employee { 
    String Id; 
    String EmpId; 
    ... 
} 

XStream xstream = new XStream(); 
xstream.alias("Employee", Employee.class); 
xstream.useAttributeFor(Employee.class, "ID"); 
xstream.aliasField("no", Blog.class, "ID"); 
Employee e = (Employee)xstream.fromXML(xml); 

그것은하지만, 고통의 비트입니다.

+0

그러나이 방법을 사용하면 어떤 자식인지 알 수 있습니다. 태그는 xml 파일에 있습니다. 파일의 자식 태그를 기반으로 객체를 동적으로 만들 수 있기를 원합니다. –

+0

특정 XML 형식으로 매핑하는 경우 구성에 큰 차이가 없습니다. http://bdoughan.blogspot.com/2010/10/how-does-jaxb-compare-to-xstream.html –

+0

' "동적으로 생성"을 이해해야합니다. 자식 태그가 기존 클래스/필드 이름 규칙과 일치하는 한 XStream은 인스턴스를 만들고 매핑합니다. – Dave

관련 문제