【问题标题】:Converting XML to Java Object using jaxb (Unmarshal)使用 jaxb (Unmarshal) 将 XML 转换为 Java 对象
【发布时间】:2017-09-21 10:10:25
【问题描述】:

我正在尝试将下面的 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 类。

临床文档.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);

结果是临床文档 [recordTarget=null]

请帮帮我!

【问题讨论】:

  • 我的猜测是您的 List 成员为空。尝试将它们初始化为空的 ArrayLists。

标签: java xml jaxb


【解决方案1】:

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

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

应该是:

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

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

另外,@XmlRootEntity 仅对您的根元素是必需的,在这种情况下是您的 ClinicalDocumentclass,您只需要将根类提供给您的 JAXBContext:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    相关资源
    最近更新 更多