从 xml 模式生成类 - Kotlin

问题描述 投票:0回答:1

我有一个 .xsd 文件和一个 .xml 文件。 我期望的是我的 Kotlin 程序从 .xsd 文件生成数据类,获取 xml 数据并将数据放入数据类中。

我手工编写了数据类。 程序运行没有任何错误,但输出没有收到任何类型的数据。 所以我认为数据类内部有问题。

我看到有一个工具叫xjc。 但运行或安装对我来说似乎是不可能的。 也许这可以解决问题? 如果有必要的话我会在 Fedora 下工作。 我的代码:

val charset = Charset.forName("ISO-8859-15")

val bufferedReader = BufferedReader(InputStreamReader(FileInputStream(args[0]), charset))
val xmlString = bufferedReader.use { it.readText() }

val jaxbContext = JAXBContext.newInstance(Standortverzeichnis::class.java)
val unmarshaller = jaxbContext.createUnmarshaller()

val reader = StringReader(xmlString)
val standortverzeichnis = unmarshaller.unmarshal(reader) as Standortverzeichnis

println("${standortverzeichnis.dateikopf}")
println("${standortverzeichnis.krankenhaus}")
println("${standortverzeichnis.standort}")

我的数据类:

package datenKlassenAusSchema

import javax.xml.bind.annotation.XmlElement
import javax.xml.bind.annotation.XmlRootElement

@XmlRootElement(name = "Standortverzeichnis", namespace = "http://xml.inek.org/schema/Standortverzeichnis")
data class Standortverzeichnis(
    @XmlElement(name = "DateiKopf")
    var dateikopf: DateikopfTyp? = null,
    @XmlElement(name = "Krankenhaus")
    var krankenhaus: MutableList<KrankenhausTyp?> = mutableListOf(),
    @XmlElement(name = "Standort")
    var standort: MutableList<StandortTyp?> = mutableListOf()
)

data class DateikopfTyp(
    @XmlElement(name = "Dateinummer")
    var dateinummer: String? = null,
    @XmlElement(name = "XmlSchemaVersion")
    var xmlSchemaVersion: String? = null,
    @XmlElement(name = "LetzteÄnderung")
    var letzteAenderung: String? = null,
    @XmlElement(name = "Erstelldatum")
    var erstelldatum: String? = null
)

data class KrankenhausTyp(
    @XmlElement(name = "Version")
    var version: String? = null,
    @XmlElement(name = "GültigVon")
    var gueltigVon: String? = null,
    @XmlElement(name = "GültigBis")
    var gueltigBis: String? = null,
    @XmlElement(name = "LetzteÄnderung")
    var letzteAenderung: String? = null,
    @XmlElement(name = "HauptIK")
    var hauptIK: IKTyp? = null,
    @XmlElement(name = "Bezeichnung")
    var bezeichnung: String? = null,
    @XmlElement(name = "Ermächtigungsgrundlage")
    var ermaechtigungsgrundlage: String? = null,
    @XmlElement(name = "Träger")
    var traeger: String? = null,
    @XmlElement(name = "Trägerart")
    var traegerArt: String? = null,
    @XmlElement(name = "Rechtsform")
    var rechtsForm: String? = null,
    @XmlElement(name = "SitzGesellschaft")
    var sitzGesellschaft: String? = null,
    @XmlElement(name = "Registriergericht")
    var registrierGericht: String? = null,
    @XmlElement(name = "Registriernummer")
    var registriernummer: String? = null,
)

data class StandortTyp(
    @XmlElement(name = "Version")
    var version: String? = null,
    @XmlElement(name = "GültigVon")
    var gueltigVon: String? = null,
    @XmlElement(name = "GültigBis")
    var gultigBis: String? = null,
    @XmlElement(name = "LetzteÄnderung")
    var letzteAnderung: String? = null,
    @XmlElement(name = "ReferenzKrankenhaus")
    var referenzKrankenhaus: KrankenhausReferenzTyp? = null,
    @XmlElement(name = "StandortId")
    var standortId: String? = null,
    @XmlElement(name = "Bezeichnung")
    var bezeichnung: String? = null,
    @XmlElement(name = "GeoAdresse")
    var geoAdresse: String? = null,
    @XmlElement(name = "Gemeindeschlüssel")
    var gemeindeSchluessel: String? = null,
    @XmlElement(name = "KVBezirk")
    var kvBezirk: String? = null,
    @XmlElement(name = "Bundesland")
    var bundesland: String? = null,
    @XmlElement(name = "Adresstyp")
    var adressTyp: String? = null,
    @XmlElement(name = "PostAdresse")
    var postAdresse: PostAdresseTyp? = null,
    @XmlElement(name = "Einrichtung")
    var einrichtung: MutableList<EinrichtungsTyp?> = mutableListOf(),
)

data class IKTyp(
    @XmlElement(name = "IK")
    var iK: String? = null,
    @XmlElement(name = "GültigVon")
    var gueltigVon: String? = null,
    @XmlElement(name = "GültigBis")
    var gueltigBis: String? = null,
)

data class KrankenhausReferenzTyp(
    @XmlElement(name = "IK")
    var ik: String? = null,
    @XmlElement(name = "Version")
    var version: String? = null,
)

data class GeoAdressTyp(
    @XmlElement(name = "GeoreferenzZone")
    var geoReferenzZone: String? = null,
    @XmlElement(name = "GeoreferenzOst")
    var geoReferenzOst: String? = null,
    @XmlElement(name = "GeoreferenzNord")
    var geoReferenzNord: String? = null,
    @XmlElement(name = "Längengrad")
    var laengenGrad: String? = null,
    @XmlElement(name = "Breitengrad")
    var breitenGrad: String? = null,
    @XmlElement(name = "PLZ")
    var plz: String? = null,
    @XmlElement(name = "Ort")
    var ort: String? = null,
    @XmlElement(name = "Straße")
    var strasse: String? = null,
    @XmlElement(name = "Hausnummer")
    var hausnummer: String? = null,
    @XmlElement(name = "Adresszusatz")
    var adressZusatz: String? = null,
)

data class PostAdresseTyp(
    @XmlElement(name = "PLZ")
    var plz: String? = null,
    @XmlElement(name = "Ort")
    var ort: String? = null,
    @XmlElement(name = "StraßePostfach")
    var strassePostfach: String? = null,
    @XmlElement(name = "Hausnummer")
    var hausNummer: String? = null,
)

data class EinrichtungsTyp(
    @XmlElement(name = "Einrichtungstyp")
    var einrichtungsTyp: String? = null,
    @XmlElement(name = "Standortnummer")
    var standortNummer: String? = null,
    @XmlElement(name = "GültigVon")
    var gueltigVon: String? = null,
    @XmlElement(name = "GültigBis")
    var gueltigBis: String? = null,
    @XmlElement(name = "Name")
    var name: String? = null,
    @XmlElement(name = "GeoAdresse")
    var geoAdresse: GeoAdressTyp? = null,
    @XmlElement(name = "AbrechnungsIK")
    var abrechnungsIK: IKTyp? = null,
    @XmlElement(name = "Betriebsstättennummer")
    var betriebsStaettenNummerTyp: BetriebsstaettennummerTyp? = null,
)

data class BetriebsstaettennummerTyp(
    @XmlElement(name = "BSNR")
    var bsnr: String? = null,
    @XmlElement(name = "GültigVon")
    var gueltigVon: String? = null,
    @XmlElement(name = "GültigBis")
    var gueltigBis: String? = null,
)
enter code here

Xml 架构文件:

<?xml version="1.0" encoding="ISO-8859-15"?>  
<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://xml.inek.org/schema/Standortverzeichnis"
    xmlns="http://xml.inek.org/schema/Standortverzeichnis"
    elementFormDefault="qualified"
>

    <xs:element name="Standortverzeichnis">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Dateikopf" type="DateikopfTyp"/>
                <xs:element name="Krankenhaus" type="KrankenhausTyp" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element name="Standort" type="StandortTyp" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="DateikopfTyp">
        <xs:sequence>
            <xs:element name="Dateinummer" type="DateinummerTyp"/>
            <xs:element name="XmlSchemaVersion" type="SchemaVersionTyp" fixed="1.0.0"/>
            <xs:element name="LetzteÄnderung" type="DatumTyp"/>
            <xs:element name="Erstelldatum" type="DatumTyp"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="KrankenhausTyp">
        <xs:sequence>
            <xs:element name="Version" type="VersionsNummerTyp"/>
            <xs:element name="GültigVon" type="DatumTyp"/>
            <xs:element name="GültigBis" type="DatumTyp" minOccurs="0"/>
            <xs:element name="LetzteÄnderung" type="DatumTyp"/>
            <xs:element name="HauptIK" type="IKTyp" maxOccurs="unbounded"/>
            <xs:element name="Bezeichnung" type="Text255Typ"/>
            <xs:element name="Ermächtigungsgrundlage" type="ErmächtigungsgrundlageTyp"/>
            <xs:element name="Träger" type="Text255Typ"/>
            <xs:element name="Trägerart" type="TrägerartTyp"/>
            <xs:element name="Rechtsform" type="RechtsformTyp" minOccurs="0"/>
            <xs:element name="SitzGesellschaft" type="Text255Typ"/>
            <xs:element name="Registriergericht" type="Text255Typ" minOccurs="0"/>
            <xs:element name="Registriernummer" type="Text255Typ" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="StandortTyp">
        <xs:sequence>
            <xs:element name="Version" type="VersionsNummerTyp"/>
            <xs:element name="GültigVon" type="DatumTyp"/>
            <xs:element name="GültigBis" type="DatumTyp" minOccurs="0"/>
            <xs:element name="LetzteÄnderung" type="DatumTyp"/>
            <xs:element name="ReferenzKrankenhaus" type="KrankenhausReferenzTyp"/>
            <xs:element name="StandortId" type="StandortIdTyp"/>
            <xs:element name="Bezeichnung" type="Text255Typ"/>
            <xs:element name="GeoAdresse" type="GeoAdresseTyp"/>
            <xs:element name="Gemeindeschlüssel" type="GemeindeschlüsselTyp"/>
            <xs:element name="KVBezirk" type="KVBezirkTyp"/>
            <xs:element name="Bundesland" type="BundeslandTyp"/>
            <xs:element name="Adresstyp" type="AdresstypTyp"/>
            <xs:element name="PostAdresse" type="PostAdresseTyp"/>
            <xs:element name="Einrichtung" type="EinrichtungsTyp" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="EinrichtungsTyp">
        <xs:sequence>
            <xs:element name="Einrichtungstyp" type="EinrichtungstypTyp"/>
            <xs:element name="Standortnummer" type="StandortnummerTyp"/>
            <xs:element name="GültigVon" type="DatumTyp"/>
            <xs:element name="GültigBis" type="DatumTyp" minOccurs="0"/>
            <xs:element name="Name" type="Text255Typ"/>
            <xs:element name="GeoAdresse" type="GeoAdresseTyp"  minOccurs="0"/>
            <xs:element name="AbrechnungsIK" type="IKTyp" maxOccurs="unbounded"/>
            <xs:element name="Betriebsstättennummer" type="BetriebsstättennummerTyp" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="GeoAdresseTyp">
        <xs:sequence>
            <xs:element name="GeoreferenzZone" type="GeoreferenzZonenTyp"/>
            <xs:element name="GeoreferenzOst" type="GeoreferenzOstTyp"/>
            <xs:element name="GeoreferenzNord" type="GeoreferenzNordTyp"/>
            <xs:element name="Längengrad" type="LängenBreitenGradTyp"/>
            <xs:element name="Breitengrad" type="LängenBreitenGradTyp"/>
            <xs:element name="PLZ" type="PlzTyp"/>
            <xs:element name="Ort" type="Text255Typ"/>
            <xs:element name="Straße" type="Text255Typ"/>
            <xs:element name="Hausnummer" type="Text20Typ"/>
            <xs:element name="AdressZusatz" type="Text50Typ" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="PostAdresseTyp">
        <xs:sequence>
            <xs:element name="PLZ" type="PlzTyp"/>
            <xs:element name="Ort" type="Text255Typ"/>
            <xs:element name="StraßePostfach" type="Text255Typ" minOccurs="0"/>
            <xs:element name="Hausnummer" type="Text20Typ" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="IKTyp">
        <xs:sequence>
            <xs:element name="IK" type="IKNummerTyp"/>
            <xs:element name="GültigVon" type="DatumTyp"/>
            <xs:element name="GültigBis" type="DatumTyp" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="BetriebsstättennummerTyp">
        <xs:sequence>
            <xs:element name="BSNR" type="BSNRTyp"/>
            <xs:element name="GültigVon" type="DatumTyp"/>
            <xs:element name="GültigBis" type="DatumTyp" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>

    <xs:simpleType name="DateinummerTyp">
        <xs:restriction base="xs:string">
            <xs:pattern value="[0-9][0-9][0-9][0-9]"/>
            <xs:length value="4"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="SchemaVersionTyp">
        <xs:restriction base="xs:string">
            <xs:pattern value="[0-9][0-9]?\.[0-9][0-9]?\.[0-9][0-9]?"/>
            <xs:minLength value="5"/>
            <xs:maxLength value="8"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="DatumTyp">
        <xs:restriction base="xs:date">
            <xs:minInclusive value="1900-01-01"/>
            <xs:maxInclusive value="2999-12-31"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="VersionsNummerTyp">
        <xs:restriction base="xs:nonNegativeInteger">
            <xs:pattern value="[0-9][0-9][0-9]"/>
            <xs:maxInclusive value="999"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="IKNummerTyp">
        <xs:restriction base="xs:nonNegativeInteger">
            <xs:pattern value="[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="BSNRTyp">
        <xs:restriction base="xs:string">
            <xs:pattern value="(([0-689][0-9])|([0-9][0-689]))[0-9][0-9][0-9][0-9][0-9][0-9][0-9]"/>
            <xs:length value="9"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="KrankenhausReferenzTyp">
        <xs:sequence>
            <xs:element name="IK" type="IKNummerTyp"/>
            <xs:element name="Version" type="VersionsNummerTyp"/>
        </xs:sequence>
    </xs:complexType>

    <xs:simpleType name="StandortIdTyp">
        <xs:restriction base="xs:positiveInteger">
            <xs:pattern value="77[0-9][0-9][0-9][0-9]"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="GeoreferenzZonenTyp">
        <xs:restriction base="xs:string">
            <xs:pattern value="3[123][TU]?"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="GeoreferenzOstTyp">
        <xs:restriction base="xs:nonNegativeInteger">
            <xs:maxInclusive value="999999"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="GeoreferenzNordTyp">
        <xs:restriction base="xs:nonNegativeInteger">
            <xs:maxInclusive value="9999999"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="LängenBreitenGradTyp">
        <xs:restriction base="xs:decimal">
            <xs:minInclusive value="0"/>
            <xs:fractionDigits value="12"/>
            <xs:totalDigits value="14"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="PlzTyp">
        <xs:restriction base="xs:nonNegativeInteger">
            <xs:minInclusive value="1000"/>
            <xs:pattern value="[0-9][0-9][0-9][0-9][0-9]"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="GemeindeschlüsselTyp">
        <xs:restriction base="xs:nonNegativeInteger">
            <xs:pattern value="[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="StandortnummerTyp">
        <xs:restriction base="xs:nonNegativeInteger">
            <xs:pattern value="77[0-9][0-9][0-9][0-9]0[0-9][0-9]"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="RechtsformTyp">
        <!-- Keine Aufzählung, da mit Erweiterungen der Werteliste zu rechnen ist -->
        <xs:restriction base="Text255Typ"/>
    </xs:simpleType>

    <xs:simpleType name="EinrichtungstypTyp">
        <!-- Keine Aufzählung, da mit Erweiterungen der Werteliste zu rechnen ist -->
        <xs:restriction base="xs:nonNegativeInteger">
            <xs:pattern value="[0-9][0-9]"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="ErmächtigungsgrundlageTyp">
        <xs:restriction base="xs:nonNegativeInteger">
            <xs:enumeration value="1"/>
            <xs:enumeration value="2"/>
            <xs:enumeration value="3"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="BundeslandTyp">
        <xs:restriction base="xs:nonNegativeInteger">
            <xs:enumeration value="1"/>
            <xs:enumeration value="2"/>
            <xs:enumeration value="3"/>
            <xs:enumeration value="4"/>
            <xs:enumeration value="5"/>
            <xs:enumeration value="6"/>
            <xs:enumeration value="7"/>
            <xs:enumeration value="8"/>
            <xs:enumeration value="9"/>
            <xs:enumeration value="10"/>
            <xs:enumeration value="11"/>
            <xs:enumeration value="12"/>
            <xs:enumeration value="13"/>
            <xs:enumeration value="14"/>
            <xs:enumeration value="15"/>
            <xs:enumeration value="16"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="KVBezirkTyp">
        <xs:restriction base="xs:nonNegativeInteger">
            <xs:enumeration value="1"/>
            <xs:enumeration value="2"/>
            <xs:enumeration value="3"/>
            <xs:enumeration value="17"/>
            <xs:enumeration value="20"/>
            <xs:enumeration value="38"/>
            <xs:enumeration value="46"/>
            <xs:enumeration value="51"/>
            <xs:enumeration value="52"/>
            <xs:enumeration value="71"/>
            <xs:enumeration value="72"/>
            <xs:enumeration value="73"/>
            <xs:enumeration value="78"/>
            <xs:enumeration value="83"/>
            <xs:enumeration value="88"/>
            <xs:enumeration value="93"/>
            <xs:enumeration value="98"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="TrägerartTyp">
        <xs:restriction base="xs:string">
            <xs:enumeration value="f"/>
            <xs:enumeration value="ö"/>
            <xs:enumeration value="p"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="AdresstypTyp">
        <xs:restriction base="xs:nonNegativeInteger">
            <xs:enumeration value="1"/>
            <xs:enumeration value="2"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="Text255Typ">
        <xs:restriction base="xs:string">
            <xs:whiteSpace value="collapse"/>
            <xs:minLength value="0"/>
            <xs:maxLength value="255"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="Text50Typ">
        <xs:restriction base="xs:string">
            <xs:whiteSpace value="collapse"/>
            <xs:minLength value="1"/>
            <xs:maxLength value="50"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="Text20Typ">
        <xs:restriction base="xs:string">
            <xs:whiteSpace value="collapse"/>
            <xs:minLength value="1"/>
            <xs:maxLength value="20"/>
        </xs:restriction>
    </xs:simpleType>

</xs:schema>

我会非常非常高兴获得帮助!

xml kotlin xsd
1个回答
0
投票

我的猜测是,JAXB(用于编组和解组的库)期望有一个具有不带属性的默认构造函数的类,并通过调用 getter 和 setter 来设置字段值,这不是初始化数据类实例的方式在科特林中。

我建议使用另一个库,对 kotlin 更友好,比如 Jackson。

最后一点:XJC 是一个用于生成与 xml 模式匹配的 java 类的工具。如果您的目标是使用 kotlin,那么这个工具对您没有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.