给定以下XML结构:

<clinical_study>
  <primary_outcome>
    <measure></measure>
    <time_frame></time_frame>
    <safety_issue></safety_issue>
    <description></description>
  </primary_outcome>
  <secondary_outcome>
    <measure></measure>
    <time_frame></time_frame>
    <safety_issue></safety_issue>
    <description></description>
  </secondary_outcome>
</clinical_study>


我想解析这些属性标记中的值,并将它们转储到具有以下列结构的名为“ CLINICAL_STUDY”的Oracle表中:

desc clinical_study
Name                         Null     Type
---------------------------- -------- -----------------
PRIMARY_OUTCOME_MEASURE               VARCHAR2(50)
PRIMARY_OUTCOME_TIME_FRAME            VARCHAR2(50)
PRIMARY_OUTCOME_SAFETY_ISSUE          VARCHAR2(50)
PRIMARY_OUTCOME_DESCRIPTION           VARCHAR2(4000)
SECONDARY_OUTCOME_MEASURE               VARCHAR2(50)
SECONDARY_OUTCOME_TIME_FRAME            VARCHAR2(50)
SECONDARY_OUTCOME_SAFETY_ISSUE          VARCHAR2(50)
SECONDARY_OUTCOME_DESCRIPTION           VARCHAR2(4000)


我认识到有几种方法可以实现此目的,但是我不确定这是最简单的。我倾向于XSLT,这些数据将“整理”数据,然后轻松地将其转换为表结构,但对是否有更简便的方法感到好奇。提前致谢。

最佳答案

如果使用Java进行编程,则无需运行XSLT转换。您应该能够从XML文件中读取数据并将其写到数据库中。

当然,有多种方法可以实现,但是一种方法是使用JAXB读取数据。 (如果您有足够小的数据,可以在处理时将其保存在内存中,则基本上可以使用。如果您有大量的数据,则可能需要使用诸如StAX之类的流XML解析器API。)

首先,您可以创建一对类来表示您的输入数据,并用JAXB批注进行批注,该批注定义了XML的映射。

@XmlRootElement(name="clinical_study")
@XmlAccessorType(XmlAccessType.FIELD)
public class ClinicalStudy {

    @XmlElement(name="primary_outcome")
    private Outcome primaryOutcome;

    @XmlElement(name="secondary_outcome")
    private Outcome secondaryOutcome;

    // getters and setters omitted for brevity
}




@XmlAccessorType(XmlAccessType.FIELD)
public class Outcome {

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

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

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

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

    // getters and setters omitted for brevity
}


然后,您可以从XML中读取或“解组”您的数据(假设inputStream是XML内容的流)。

    JAXBContext context = JAXBContext.newInstance(ClinicalStudy.class);
    Unmarshaller unmarshaller = context.createUnmarshaller();
    ClinicalStudy clinicalStudy = (ClinicalStudy) unmarshaller.unmarshal(inputStream);


并将其插入数据库(假设connJDBC数据库连接)。

    PreparedStatement pstmt = conn.prepareStatement(
            "INSERT INTO clinical_study ("
            + "PRIMARY_OUTCOME_MEASURE, "
            + "PRIMARY_OUTCOME_TIME_FRAME, "
            + "PRIMARY_OUTCOME_SAFETY_ISSUE, "
            + "PRIMARY_OUTCOME_DESCRIPTION, "
            + "SECONDARY_OUTCOME_MEASURE, "
            + "SECONDARY_OUTCOME_TIME_FRAME, "
            + "SECONDARY_OUTCOME_SAFETY_ISSUE, "
            + "SECONDARY_OUTCOME_DESCRIPTION) "
            + "VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
    pstmt.setString(1, clinicalStudy.getPrimaryOutcome().getMeasure());
    pstmt.setString(2, clinicalStudy.getPrimaryOutcome().getTimeFrame());
    pstmt.setString(3, clinicalStudy.getPrimaryOutcome().getSafetyIssue());
    pstmt.setString(4, clinicalStudy.getPrimaryOutcome().getDescription());
    pstmt.setString(5, clinicalStudy.getSecondaryOutcome().getMeasure());
    pstmt.setString(6, clinicalStudy.getSecondaryOutcome().getTimeFrame());
    pstmt.setString(7, clinicalStudy.getSecondaryOutcome().getSafetyIssue());
    pstmt.setString(8, clinicalStudy.getSecondaryOutcome().getDescription());
    pstmt.execute();

10-06 12:40
查看更多