第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

JAXB/XSD:數(shù)字而不是元素名稱

JAXB/XSD:數(shù)字而不是元素名稱

動(dòng)漫人物 2022-08-17 10:30:36
我必須從xml文件創(chuàng)建Java對(duì)象(轉(zhuǎn)換前我無(wú)法編輯),所以我認(rèn)為最好創(chuàng)建一個(gè)XSD,然后通過(guò)JAXB取消marshall文件。問(wèn)題是,該 XML 中有一些元素的格式如下所示:<parent-element>     <id-00001>...</id-00001>     <id-00002>...</id-00002>     ... </parent-element>所以基本上我有一個(gè)xml元素列表,元素的“名稱”是列表中的順序。每個(gè)列表中的元素?cái)?shù)量可能不受限制。是否可以使用 JAXB 對(duì)此進(jìn)行解構(gòu),或者我是否必須使用 XML 讀取器并循環(huán)訪問(wèn)這些元素?“id-XXXXX”元素在內(nèi)部都以相同的方式格式化,因此,如果將其格式化為“”,則可以沒(méi)有任何問(wèn)題。提前致謝!
查看完整描述

2 回答

?
嗶嗶one

TA貢獻(xiàn)1854條經(jīng)驗(yàn) 獲得超8個(gè)贊

我猜你的有效載荷如下所示:XML


<root>

    <parent-element>

        <id-00001>value 1</id-00001>

        <id-00002>value 2</id-00002>

    </parent-element>

</root>

要讀取具有動(dòng)態(tài)名稱的節(jié)點(diǎn),我們需要編寫(xiě)自定義適配器()。假設(shè)該模型如下所示:javax.xml.bind.annotation.adapters.XmlAdapter


@XmlRootElement(name = "root")

@XmlAccessorType(XmlAccessType.FIELD)

class Root {


    @XmlElement(name = "parent-element")

    @XmlJavaTypeAdapter(IdsXmlAdapter.class)

    private MultiItemList list;


    // getters, setters, toString

}


class MultiItemList {


    private List<String> ids;


    // getters, setters, toString

}

對(duì)于上述和型號(hào),自定義適配器可能如下所示:XMLPOJO


class IdsXmlAdapter extends XmlAdapter<Object, MultiItemList> {


    @Override

    public MultiItemList unmarshal(Object v) {

        Element element = (Element) v;

        NodeList childNodes = element.getChildNodes();

        List<String> ids = new ArrayList<>(childNodes.getLength());

        for (int i = 0; i < childNodes.getLength(); i++) {

            Node item = childNodes.item(i);

            if (item.getNodeName().equals("#text")) {

                continue;

            }

            ids.add(item.getTextContent());

        }


        MultiItemList multiItemList = new MultiItemList();

        multiItemList.setIds(ids);

        return multiItemList;

    }


    @Override

    public Object marshal(MultiItemList v) throws Exception {

        return null; // Implement if needed

    }

}

用法示例:


import org.w3c.dom.Element;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;


import javax.xml.bind.JAXBContext;

import javax.xml.bind.annotation.XmlAccessType;

import javax.xml.bind.annotation.XmlAccessorType;

import javax.xml.bind.annotation.XmlElement;

import javax.xml.bind.annotation.XmlRootElement;

import javax.xml.bind.annotation.adapters.XmlAdapter;

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

import java.io.File;

import java.io.FileReader;

import java.util.ArrayList;

import java.util.List;


public class JaxbApp {


    public static void main(String[] args) throws Exception {

        File xmlFile = new File("./resource/test.xml").getAbsoluteFile();


        JAXBContext jaxbContext = JAXBContext.newInstance(Root.class);


        Object unmarshal = jaxbContext.createUnmarshaller().unmarshal(new FileReader(xmlFile));

        System.out.println(unmarshal);

    }

}

指紋:


Root{list=Root{ids=[value 1, value 2]}}

請(qǐng)注意,由于異常,您無(wú)法直接實(shí)現(xiàn)適配器:XmlAdapter<Element, MultiItemList>


Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions

org.w3c.dom.Element is an interface, and JAXB can't handle interfaces.

    this problem is related to the following location:

        at org.w3c.dom.Element


查看完整回答
反對(duì) 回復(fù) 2022-08-17
?
慕妹3146593

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超9個(gè)贊

由于您的xml可能具有無(wú)限數(shù)量的“id元素”,因此創(chuàng)建匹配的POJO結(jié)構(gòu)是很棘手的。您可以使用和適配器。 將不同的元素作為 dom 節(jié)點(diǎn)讀取,您可以在適配器中處理它們。@XmlAnyElement@XmlAnyElement


例如,使用下面給出的 xml:


<parent-element>

    <id-00001>value 1</id-00001>

    <id-00002>value 2</id-00002>

</parent-element>

您的根可能如下所示:


@XmlRootElement(name = "parent-element")

@XmlAccessorType(XmlAccessType.FIELD)

public class Root {


    @XmlAnyElement

    @XmlJavaTypeAdapter(MyAdapter.class)

    private List<String> varyingElements;


}

和您的適配器,如下所示:


public class MyAdapter extends XmlAdapter<Element, String> {


    @Override

    public Element marshal(String arg0) throws Exception {

        // do what you must

        return null;

    }


    @Override

    public String unmarshal(Element element) throws Exception {

        return element.getChildNodes().item(0).getNodeValue();

    }


}

元素如org.w3c.dom.Element


查看完整回答
反對(duì) 回復(fù) 2022-08-17
  • 2 回答
  • 0 關(guān)注
  • 120 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)