2017-09-21 1 views
0

아래의 XML을 java 객체로 변환하려고합니다. 나는 "providerOrganization"에서 "이름"의 값을 얻을 필요가jaxb (Unmarshal)를 사용하여 XML을 Java 객체로 변환

<ClinicalDocument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:hl7-org:v3" xmlns:sdtc="urn:hl7-org:sdtc" xmlns:voc="urn:hl7-org:v3/voc"> 
    <confidentialityCode code="" codeSystem=""/> 
    <languageCode code="en-"/> 
    <recordTarget> 
    <patientRole> 
     <id root="" extension=""/> 
     <telecom value="" use=""/> 
     <providerOrganization> 
     <id root="" extension=""/> 
     <id root="" extension=""/> 
     <name>Something</name> 
     <telecom value=""/> 
     <addr use=""> 
     <state></state> 
     <city></city> 
     <postalCode></postalCode> 
     <streetAddressLine>2121</streetAddressLine> 
     </addr> 
     </providerOrganization> 
    </patientRole> 
    </recordTarget> 
</ClinicalDocument> 

:

이 내 XML이다. 다음은 Java 클래스입니다.

ClinicalDocument.java

package com.biclinical.data; 
import java.util.List; 

import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name="ClinicalDocument", namespace="urn:hl7-org:v3") 
public class ClinicalDocument { 

    @XmlElement(name="recordTarget") 
    private List<RecordTarget> recordTarget; 

    public List<RecordTarget> getRecordTarget() { 
     return recordTarget; 
    } 

    public void setRecordTarget(List<RecordTarget> recordTarget) { 
     this.recordTarget = recordTarget; 
    } 

    @Override 
    public String toString() { 
     return "ClinicalDocument [recordTarget=" + recordTarget + "]"; 
    } 
} 

RecordTarget.java

package com.biclinical.data; 

import java.util.List; 

import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name="recordTarget") 
public class RecordTarget { 

    @XmlElement(name="patientRole") 
    private List<PatientRole> patientRole; 

    public List<PatientRole> getPatientRole() { 
     return patientRole; 
    } 

    public void setPatientRole(List<PatientRole> patientRole) { 
     this.patientRole = patientRole; 
    } 

    @Override 
    public String toString() { 
     return "RecordTarget [patientRole=" + patientRole +"]"; 
    } 
} 

PatientRole.java

package com.biclinical.data; 

    import java.util.List; 

    import javax.xml.bind.annotation.*; 

    @XmlAccessorType(XmlAccessType.FIELD) 
    @XmlRootElement(name = "patientRole") 
    public class PatientRole { 

     /*@XmlElement(name = "id") 
     private String id; 
     Double root; 
     String extension;*/ 

     @XmlElement(name="providerOrganization") 
     private List<ProviderOrganization> providerOrganization; 

     public List<ProviderOrganization> getProviderOrganization() { 
      return providerOrganization; 
     } 

     public void setProviderOrganization(List<ProviderOrganization> providerOrganization) { 
      this.providerOrganization = providerOrganization; 
     } 

    } 

ProviderOrganisation.java

package com.biclinical.data; 

import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name="providerOrganization") 
public class ProviderOrganization { 

    @XmlElement(name="name") 
    private String name; 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    public String toString() { 
     return "Patient [Name=" + name + "]"; 
    } 
} 
XMLFileParserSAXUtility.java

public class XMLFileParserSAXUtility extends DefaultHandler { 

    public static void main(String[] args) { 
     try { 

      File file = new File("C:/Users/shivendras/Desktop/Patient19999_Test_Organization1.xml"); 
      JAXBContext jaxbContext = JAXBContext.newInstance(new Class[] {ClinicalDocument.class,RecordTarget.class,PatientRole.class,ProviderOrganization.class}); 
      Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
      ClinicalDocument clinicalDocument = (ClinicalDocument) jaxbUnmarshaller.unmarshal(file); 
      //clinicalDocument.getRecordTarget() 
      String s = ((File) ((PatientRole) ((RecordTarget) clinicalDocument.getRecordTarget()).getPatientRole()).getProviderOrganization()).getName(); 
      System.out.println(s); 
     } catch (JAXBException e) { 
      e.printStackTrace(); 
      } 
    } 

0

나는

Exception in thread "main" java.lang.NullPointerException 
    at com.biclinical.util.XMLFileParserSAXUtility.main(XMLFileParserSAXUtility.java:27) 

같은 결과를 얻을 그리고 난 (clinicalDocument) syso 인쇄하려고하면,

결과 ClinicalDocument이다 recordTarget = NULL]

여기 나 좀 도와주세요!

+0

내 생각에 List <> 멤버는 null입니다. ArrayLists를 빈 배열로 초기화 해보십시오. – Corey

답변

0

나는 당신이 당신의 @XmlElement에 네임 스페이스를 추가 생각 :

@XmlElement(name="patientRole") 
private List<PatientRole> patientRole; 

가되어야한다

당신이 당신의 객체의 다른 널 (null)가 발생하는 경우
@XmlElement(name="patientRole",namespace="urn:hl7-org:v3") 
private List<PatientRole> patientRole; 

가, 네임 스페이스를 추가하려고합니다.

또한, @XmlRootEntity이 경우 귀하의 ClinicalDocument 클래스에서, 루트 요소에만 필요합니다, 당신은 당신 JAXBContext에에 루트 클래스를 제공해야합니다

JAXBContext jaxbContext = JAXBContext.newInstance(ClinicalDocument.class); 
0

당신이 쓰는 다음 코드는 아니다 올바른 :

: 당신이 clinicalDocument.getRecordTarget()를를 얻을, 캐스팅하려고하면

((File) ((PatientRole) ((RecordTarget) clinicalDocument.getRecordTarget()).getPatientRole()).getProviderOrganization()).getName() 

는 것이다 그것은 같은 예외가 발생합니다

Exception in thread "main" java.lang.ClassCastException: java.util.ArrayList cannot be cast to RecordTarget 

clinicalDocument.getRecordTarget() RecordTarget의 반환 목록입니다. 그래서 다음과 같은 방법으로 객체를 얻어야합니다.

if(!clinicalDocument.getRecordTarget().isEmpty() || 
       !clinicalDocument.getRecordTarget().get(0).getPatientRole().isEmpty() || 
       !clinicalDocument.getRecordTarget().get(0).getPatientRole().get(0).getProviderOrganization().isEmpty()) { 
      System.out.println(clinicalDocument.getRecordTarget().get(0).getPatientRole().get(0).getProviderOrganization()); 
     } 
관련 문제