1

ファイルとして情報を持っていXMLます。それらを使用するには、.xml を介して XML をオブジェクトに解析したいと考えていますJAXB
私の唯一の問題は、すべての子メモが解析後にあることnullです。属性のみが解析されました。

ルートクラス:

package xml;

import java.util.Date;
import java.util.List;

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

import xml.messstrecke.ZEBMessstrecke;

@XmlRootElement(name = "RohdatenTP2Netz", namespace = "http://www.BASt.de/ZEB/Rohdaten/Version_3_0")
public class RohdatenTP2Netz
{
    //Attributes
    private String merkmal;
    private String typ;
    private Date erstelldatum;
    private String bemerkung;

    //List of Childs
    private List<ZEBMessstrecke> zebMessstrecken;

    public @XmlAttribute(name = "Merkmal", required = true) String getMerkmal()
    {
        return merkmal;
    }
    public void setMerkmal(String merkmal)
    {
        this.merkmal = merkmal;
    }
    public @XmlAttribute(name = "Typ", required = true) String getTyp()
    {
        return typ;
    }
    public void setTyp(String typ)
    {
        this.typ = typ;
    }
    public @XmlAttribute(name = "Erstelldatum", required = true) Date getErstelldatum()
    {
        return erstelldatum;
    }
    public void setErstelldatum(Date erstelldatum)
    {
        this.erstelldatum = erstelldatum;
    }
    public @XmlAttribute(name = "Bemerkung", required = true) String getBemerkung()
    {
        return bemerkung;
    }
    public void setBemerkung(String bemerkung)
    {
        this.bemerkung = bemerkung;
    }
    public @XmlElement(required = true, type = ZEBMessstrecke.class) List<ZEBMessstrecke> getZebMessstrecken()
    {
        return zebMessstrecken;
    }
    public void setZebMessstrecken(List<ZEBMessstrecke> zebMessstrecken)
    {
        this.zebMessstrecken = zebMessstrecken;
    }
}

ZEBMessstrecke の子クラス:

package xml.messstrecke;

import java.util.List;

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

import xml.messstrecke.datenstrom.Datenstrom;

@XmlRootElement(namespace="http://www.BASt.de/ZEB/Rohdaten/Version_3_0")
public class ZEBMessstrecke
{
    //Attribute
    private String mnr;
    private String mra;

    //KindElemente
    private ZEBHeader header;
    private List<Datenstrom> datenstroeme;

    public @XmlAttribute(name = "mnr", required = true) String getMnr()
    {
        return mnr;
    }
    public void setMnr(String mnr)
    {
        this.mnr = mnr;
    }
    public @XmlAttribute(name = "mra", required = true) String getMra()
    {
        return mra;
    }
    public void setMra(String mra)
    {
        this.mra = mra;
    }
    public @XmlElement(name = "ZEBHeader", required = true) ZEBHeader getHeader()
    {
        return header;
    }
    public void setHeader(ZEBHeader header)
    {
        this.header = header;
    }
    public @XmlElement(name = "Datenstrom", required = true) List<Datenstrom> getDatenstroeme()
    {
        return datenstroeme;
    }
    public void setDatenstroeme(List<Datenstrom> datenstroeme)
    {
        this.datenstroeme = datenstroeme;
    }
}

xml ファイル:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<RohdatenTP2Netz Merkmal="Griffigkeit" Typ="Netzorientiert" Erstelldatum="2012-09-28" xmlns="http://www.BASt.de/ZEB/Rohdaten/Version_3_0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Bemerkung="">
    <ZEBMessstrecke mnr="357/11" mra="0.4">
        <ZEBHeader>
            <Bildparameter Datentraeger="LISt__BSt_12_001">
                <Messpunktabstand_Bilder>1 Wert pro 10 Meter</Messpunktabstand_Bilder>
                <Kamera Nr="1" Name="Frontkamera" PixelH="720" PixelV="576" Bildformat="jpg" RootVerzeichnis="Kamera_01\B 096_"/>
            </Bildparameter>
            <Zusatzparameter/>
            <MapInfoStrassennetz Pfad_und_Basisname="ZEB2012B_1400_GRUNDDATEN_V_1_0_0">
                <DAT>X</DAT>
                <ID>X</ID>
                <MAP>X</MAP>
                <TAB>X</TAB>
            </MapInfoStrassennetz>
            <ZEBAdministration Jahr="2012" Strassenklasse="B" ZENDI="140000" Anlass="Zwischentermin2" Dateiversion="1"/>
            <Messparameter Messsystem="SKM" KfzKennz="MW-LI 21" Messgeraetebauer="BfW Traunstein" Messsystembetreiber="LISt GmbH Rochlitz" Messprinzip="schraeggestelltes Rad" Fahrer="Schmidt" Operator="Pusch" Positionsbestimmungsverfahren="DGPS">
                <Messpunktabstand_Messgeschwindigkeit>1 Wert pro 1 Meter</Messpunktabstand_Messgeschwindigkeit>
                <Messpunktabstand_Fahrbahntemperatur>1 Wert pro 1 Meter</Messpunktabstand_Fahrbahntemperatur>
                <Messpunktabstand_Reifentemperatur>1 Wert pro 1 Meter</Messpunktabstand_Reifentemperatur>
                <Messpunktabstand_Lufttemperatur>1 Wert pro 1 Meter</Messpunktabstand_Lufttemperatur>
                <Messpunktabstand_Wassertemperatur>1 Wert pro 1 Meter</Messpunktabstand_Wassertemperatur>
                <Messpunktabstand_Seitenkraftbeiwert>1 Wert pro 1 Meter</Messpunktabstand_Seitenkraftbeiwert>
                <Messpunktabstand_Seitenabstand>1 Wert pro 1 Meter</Messpunktabstand_Seitenabstand>
                <Messlinie>rechte Rollspur</Messlinie>
            </Messparameter>
        </ZEBHeader>
        <Datenstrom LfdM="511" Datum="2012-05-31" Uhr="11:19:57" G="0" Bemerkung="" mrl="0" />
        <Datenstrom LfdM="525" Datum="2012-05-31" Uhr="11:19:58" G="0" Bemerkung="" mrl="0" />
    </ZEBMessstrecke>
</RohdatenTP2Netz>
4

3 に答える 3

1

パッケージ レベルの@XmlSchema注釈を利用して、各パッケージ内のクラスの名前空間修飾を指定する必要があります。

xml/パッケージ情報.java

@XmlSchema( 
    namespace = "http://www.BASt.de/ZEB/Rohdaten/Version_3_0", 
    elementFormDefault = XmlNsForm.QUALIFIED) 
package xml;

import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

xml/messstrecke/package-info.java

@XmlSchema( 
    namespace = "http://www.BASt.de/ZEB/Rohdaten/Version_3_0", 
    elementFormDefault = XmlNsForm.QUALIFIED) 
package xml.messstrecke;

import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

詳細については

于 2012-10-08T10:27:31.870 に答える
0

その代わり :

public @XmlElement(required = true, type = ZEBMessstrecke.class) List<ZEBMessstrecke> getZebMessstrecken()

以下を使用する必要があります。

@XmlList 
@XmlElement(required = true, type = ZEBMessstrecke.class)
public List<ZEBMessstrecke> getZebMessstrecken()
于 2012-10-05T13:45:40.707 に答える
0

注釈@XmlElementは というメソッド上にあるため、 ではなくgetZebMessstreckenという名前の要素を探します。要素名を明示的にする必要があります。つまり、zebMessstreckenZEBMessstrecke

@XmlElement(name = "ZEBMessstrecke", required = true)

また、JAXB がmaxOccurs="unbounded"要素をマップする通常の方法は、setter ではなく getter のみを生成し、getter が最初に呼び出されたときに空のリストを返すようにすることです。パターンは、呼び出し元がListgetter から を取得し、要素をこのリストに直接追加するというものです。だから、次のようなものを試してください:

@XmlElement(name = "ZEBMessstrecke", required = true)
public List<ZEBMessstrecke> getZebMessstrecken() {
  if(zebMessstrecken == null) {
    zebMessstrecken = new ArrayList<ZEBMessstrecke>();
  }
  return zebMessstrecken;
}

// no setZebmessstrecken method

typeメソッドの戻り値の型から推測できるため、 は必要ありません。

編集:また、クラスの@XmlType注釈に正しい名前空間があることを確認してください。ZEBMessstrecke

于 2012-10-05T13:51:29.180 に答える