当前位置: 首页 > 知识库问答 >
问题:

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

居京
2023-03-14

我试图将我下面的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>

我需要在"提供者组织"下获取"name"的值。下面是我Java课。

诊所ocument.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 + "]";
    }
}

记录目标。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 +"]";
    }
}

病人ole.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;
        }

    }

供应商组织。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(临床文件);

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

请帮帮我!

共有1个答案

燕文昌
2023-03-14

我认为您将名称空间添加到您的@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);
 类似资料:
  • 我想使用XML有效载荷,比如: 另一种有效载荷是: 所以我想为创建一个类,其中包含和一个,我可以在其中放置不同类型的对象,所以我尝试了多种类型的对象一个带有的类,但它不允许我具有相同的名称 在这种情况下我能做什么?提前感谢。

  • 我有以下XML,需要将其转换为java对象。 我不确定当我使用JAXB转换它时,我的pojo将是什么。 根据我的理解,我创建了以下POJO: 请帮帮我。提前感谢。

  • 我有一个类,它有一个包含的列表。在我的应用程序中,我在中设置细节,然后添加到的中,然后使用将转换为。 下面代码行的1个illegalAnnotationExc一定类有两个相同名称的属性trainingList

  • 我试图使用JAXB将ArrayList转换为xml... ...但它不工作,我得到这个错误: 2012年8月27日10:43:58组织。阿帕奇。卡塔琳娜。果心StandardWrapperValve:Servlet。路径为[/Spring3 LDAP WebService]的上下文中servlet[spring]的service()引发异常[请求处理失败;嵌套异常为javax.xml.bind.J

  • 我正在尝试使用JAXB从对象构建XML。 但是我错过了一些东西,因为我得到了一个例外: javax.xml.bind.MarshalExc0019-具有链接异常:[com.sun.istack.internal.SAXException2:类雇员及其任何超级类在此上下文中都是已知的。javax.xml.bind.JAXBExc0019:类雇员及其任何超级类在此上下文中都是已知的。]

  • 我怎么能转换java对象到xml?我试图转换一个传入的java对象到xml在Spring集成与转换器豆。有没有其他的方法比编组在Jaxb?喜欢使用@TypeConver。或实现转换器类。