繁体   English   中英

使用jaxb将XML转换为Java对象(Unmarshal)

[英]Converting XML to Java Object using jaxb (Unmarshal)

我正在尝试将下面的xml转换为java对象。

这是我的xml:

<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>

我需要在“ providerOrganization”下获取“ name”的值。 下面是我的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();
          }
    }

我得到的结果是

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

如果我尝试打印syso(clinicalDocument);

结果为ClinicalDocument [recordTarget = null]

请帮我在这里!

我认为您将名称空间添加到您的@XmlElement

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

应该 :

@XmlElement(name="patientRole",namespace="urn:hl7-org:v3")
private List<PatientRole> patientRole;

如果对象中有其他任何null,请尝试添加名称空间。

另外, @XmlRootEntity仅对于您的根元素(在本例中为ClinicalDocument类)是必需的,并且只需要将根类提供给JAXBContext:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM