我有一个 .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>
我会非常非常高兴获得帮助!
我的猜测是,JAXB(用于编组和解组的库)期望有一个具有不带属性的默认构造函数的类,并通过调用 getter 和 setter 来设置字段值,这不是初始化数据类实例的方式在科特林中。
我建议使用另一个库,对 kotlin 更友好,比如 Jackson。
最后一点:XJC 是一个用于生成与 xml 模式匹配的 java 类的工具。如果您的目标是使用 kotlin,那么这个工具对您没有帮助。