4

以下に定義されているように、次の xml を別の親オブジェクトにアンマーシャリングしたいと考えています。ただし、常に NULL を返します。

着信 XML:

<contentFiles>
<contentFile>
<contentFileName>cwb_reg_content_IB20C0F504A9A11E281E4C8BF76F4977C.pdf</contentFileName>
<title><![CDATA[SEC No-Action Guidance Expanding the Definition of “Ready Market” for Certain Foreign Equity Securities]]></title>
<sourcePublicationDate>20121219</sourcePublicationDate>
<alternateDocNumbers>
  <alternateDocNumber>12345-b</alternateDocNumber>
</alternateDocNumbers>
<citesAffected>
   <cite>SEA Rule 15c3-1</cite>
</citesAffected>
</contentFile>
</contentFiles>    

に対応する親クラス<contentFiles>

 @XmlRootElement(name = "contentFiles")
    public class RtSuperQuickMetadata
    {
        private List<RtSuperQuickMetadataItem> rtSuperQuickMetadataItems;

        public RtSuperQuickMetadata()
        {
            rtSuperQuickMetadataItems = new ArrayList<RtSuperQuickMetadataItem>();
        }

        public List<RtSuperQuickMetadataItem> getRtSuperQuickMetadataItems()
        {
            return rtSuperQuickMetadataItems;
        }

        public void setRtSuperQuickMetadataItems(
            List<RtSuperQuickMetadataItem> rtSuperQuickMetadataItems)
        {
            this.rtSuperQuickMetadataItems = rtSuperQuickMetadataItems;
        }

    }

に対応する親クラス<contentFile>

@XmlRootElement(name = "contentFile")
public class RtSuperQuickMetadataItem
{
    private String contentFileName;
    private String title;
    private String sourcePublicationDate;
    private List<AlternateDocNumber> alternateDocNumbers;
    private List<Cite> citesAffected;

    public RtSuperQuickMetadataItem()
    {
        alternateDocNumbers = new ArrayList<AlternateDocNumber>();
        citesAffected = new ArrayList<Cite>();
    }


    public List<AlternateDocNumber> getAlternateDocNumbers()
    {
        return alternateDocNumbers;
    }


    public List<Cite> getCitesAffected()
    {
        return citesAffected;
    }


    public String getContentFileName()
    {
        return contentFileName;
    }


    public String getSourcePublicationDate()
    {
        return sourcePublicationDate;
    }

    public String getTitle()
    {
        return title;
    }


    public void setAlternateDocNumbers(List<AlternateDocNumber> alternateDocNumbers)
    {
        this.alternateDocNumbers = alternateDocNumbers;
    }


    public void setCitesAffected(List<Cite> citesAffected)
    {
        this.citesAffected = citesAffected;
    }


    public void setContentFileName(String contentFileName)
    {
        this.contentFileName = contentFileName;
    }


    public void setSourcePublicationDate(String sourcePublicationDate)
    {
        this.sourcePublicationDate = sourcePublicationDate;
    }

    public void setTitle(String title)
    {
        this.title = title;
    }

}


@XmlRootElement(name = "alternateDocNumber")
class AlternateDocNumber
{
    private String alternateDocNumber;

    public String getAlternateDocNumber()
    {
        return alternateDocNumber;
    }

    public void setAlternateDocNumber(String alternateDocNumber)
    {
        this.alternateDocNumber = alternateDocNumber;
    }

    @Override
    public String toString()
    {
        return "AlternateDocNumber [alternateDocNumber=" + alternateDocNumber + "]";
    }
}


@XmlRootElement(name = "cite")
class Cite
{
    private String cite;

    public String getCite()
    {
        return cite;
    }

    public void setCite(String cite)
    {
        this.cite = cite;
    }

    @Override
    public String toString()
    {
        return "Cite [cite=" + cite + "]";
    }
}

JAXB を使用したアンマーシャラー コード:

public RtSuperQuickMetadata unmarshallXml(final File metadataFile)
        throws JAXBException, FileNotFoundException
    {
        RtSuperQuickMetadata rtSuperQuickMetadata = null;
        try
        {
            JAXBContext jc = JAXBContext.newInstance(RtSuperQuickMetadata.class);

            Unmarshaller um = jc.createUnmarshaller();
            rtSuperQuickMetadata =
                (RtSuperQuickMetadata) um.unmarshal(metadataFile);
        }
        catch (JAXBException e)
        {
            String msg = "Malformed XML supplied as Metadata" + " Msg " + e.getMessage();
            LOG.error(msg, e);
            throw new RuntimeException(msg, e);
        }

        return rtSuperQuickMetadata;
    }
4

2 に答える 2

3

が多すぎXmlRootElementsます。通常、これは最上位の要素のみで使用します。あなたがしたいことは、子供たちに としてラベルを付けることですXmlElement

XmlRootElementルート要素 (つまり ) 以外のすべてから注釈を削除し、ロード元のクラスでRtSuperQuickMetadataラベルを付けます。XmlElement

例として、RtSuperQuickMetadataクラスは次のようになります。

@XmlRootElement(name = "contentFiles")
class RtSuperQuickMetadata
{
    private List<RtSuperQuickMetadataItem> rtSuperQuickMetadataItems;

    public RtSuperQuickMetadata()
    {
        rtSuperQuickMetadataItems = new ArrayList<RtSuperQuickMetadataItem>();
    }

    @XmlElement(name = "contentFile")
    public List<RtSuperQuickMetadataItem> getRtSuperQuickMetadataItems()
    {
        return rtSuperQuickMetadataItems;
    }

    public void setRtSuperQuickMetadataItems(
            List<RtSuperQuickMetadataItem> rtSuperQuickMetadataItems)
    {
        this.rtSuperQuickMetadataItems = rtSuperQuickMetadataItems;
    }

}

この原則をalternateDocNumbersandcitesAffectedにも転送します。


注釈に基づいて XML がどのようにフォーマットされていると が考えるかの例を見たい場合はUnmarshaller、コードで構造を作成し、Marshaller. これは簡単で醜い例です:

RtSuperQuickMetadata rtSuperQuickMetadata = new RtSuperQuickMetadata();

List<RtSuperQuickMetadataItem> rtSuperQuickMetadataItems = new ArrayList<RtSuperQuickMetadataItem>();
rtSuperQuickMetadata.setRtSuperQuickMetadataItems(rtSuperQuickMetadataItems);

RtSuperQuickMetadataItem item = new RtSuperQuickMetadataItem();
rtSuperQuickMetadataItems.add(item);

ArrayList<Cite> cites = new ArrayList<Cite>();
Cite cite = new Cite();
cite.setCiteStr("MyCite");
cites.add(cite);
item.setCitesAffected(cites);

Marshaller m = jaxbContext.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(rtSuperQuickMetadata, System.out);

これにより、結果が に出力されSystem.outます。必要に応じて、代わりにこれをファイルに入れることができます。

于 2013-02-05T19:40:55.257 に答える
1

cklabからの回答に対するコメントとして投稿したフォローアップの質問に対処するために、この回答を追加しました。

別の質問がありました。jaxb がオブジェクトに含まれるリストにメモリを自動的に割り当てないのはなぜですか。コンストラクターでメモリを割り当てる必要があるのはなぜですか?

必要はありません。以下を参照してください。

これらのアイテムをアンマーシャリングしている間、以下はメタデータ オブジェクトに保存されません。12 これを生成するには別の要素を追加する必要がありますか??

以下のマッピングを参照してください。

RtSuperQuickメタデータ

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement(name = "contentFiles")
public class RtSuperQuickMetadata {

    private List<RtSuperQuickMetadataItem> rtSuperQuickMetadataItems;

    @XmlElement(name="contentFile")
    public List<RtSuperQuickMetadataItem> getRtSuperQuickMetadataItems() {
        return rtSuperQuickMetadataItems;
    }

    public void setRtSuperQuickMetadataItems(
            List<RtSuperQuickMetadataItem> rtSuperQuickMetadataItems) {
        this.rtSuperQuickMetadataItems = rtSuperQuickMetadataItems;
    }

}

RtSuperQuickMetadataItem

import java.util.List;
import javax.xml.bind.annotation.XmlType;

@XmlType(propOrder={"contentFileName", "title", "sourcePublicationDate", "alternateDocNumbers", "citesAffected"})
public class RtSuperQuickMetadataItem {
    private String contentFileName;
    private String title;
    private String sourcePublicationDate;
    private List<AlternateDocNumber> alternateDocNumbers;
    private List<Cite> citesAffected;

    public List<AlternateDocNumber> getAlternateDocNumbers() {
        return alternateDocNumbers;
    }

    public List<Cite> getCitesAffected() {
        return citesAffected;
    }

    public String getContentFileName() {
        return contentFileName;
    }

    public String getSourcePublicationDate() {
        return sourcePublicationDate;
    }

    public String getTitle() {
        return title;
    }

    public void setAlternateDocNumbers(
            List<AlternateDocNumber> alternateDocNumbers) {
        this.alternateDocNumbers = alternateDocNumbers;
    }

    public void setCitesAffected(List<Cite> citesAffected) {
        this.citesAffected = citesAffected;
    }

    public void setContentFileName(String contentFileName) {
        this.contentFileName = contentFileName;
    }

    public void setSourcePublicationDate(String sourcePublicationDate) {
        this.sourcePublicationDate = sourcePublicationDate;
    }

    public void setTitle(String title) {
        this.title = title;
    }

}

代替文書番号

class AlternateDocNumber {

    private String alternateDocNumber;

    public String getAlternateDocNumber() {
        return alternateDocNumber;
    }

    public void setAlternateDocNumber(String alternateDocNumber) {
        this.alternateDocNumber = alternateDocNumber;
    }

}

引用する

class Cite {

    private String cite;

    public String getCite() {
        return cite;
    }

    public void setCite(String cite) {
        this.cite = cite;
    }

}
于 2013-02-06T14:26:56.490 に答える