亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 JAXB 的動態 XML 屬性

使用 JAXB 的動態 XML 屬性

小怪獸愛吃肉 2022-09-22 20:06:03
我有一個文件,我試圖使用XMLJAXB<root>    <object att1="orgA" att2="orgA" id="6" name="">        ...    </object></root>Java類:@AllArgsConstructor@NoArgsConstructor@ToString@Setter@XmlRootElement(name="object")public class ObjectElement implements Serializable {@XmlAttributeprivate int id;@XmlAttributeprivate String attr1;@XmlAttributeprivate String attr2;@XmlAttributeprivate String name;}問題:xml 元素的屬性可能會動態更改。因此,屬性的鍵可能是動態的,因此無法將它們放在類中。有沒有辦法定義某種讀取所有鍵和相應值的方法?例如,新對象可能具有完全不同的屬性,如下所示;objectXmlAttributesHashMapobject<object att5="some" att7="other" id="6" name="value">    ...</object>
查看完整描述

1 回答

?
慕森王

TA貢獻1777條經驗 獲得超3個贊

您需要編寫擴展類的自定義適配器。在您的情況下,我們可以創建一個表示所有屬性的。讀取屬性后,您可以使用反射或手動設置所有字段。動態讀取所有屬性的自定義刪除程序可能如下所示:javax.xml.bind.annotation.adapters.XmlAdapterMapPOJO


class ItemXmlAdapter extends XmlAdapter<Object, Item> {


    @Override

    public Item unmarshal(Object v) {

        Element element = (Element) v;


        Map<String, String> properties = new HashMap<>();

        NamedNodeMap attributes = element.getAttributes();

        for (int i = attributes.getLength() - 1; i >= 0; i--) {

            Node node = attributes.item(i);

            properties.put(node.getNodeName(), node.getNodeValue());

        }


        Item item = new Item();

        item.setProperties(properties);


        return item;

    }


    @Override

    public Object marshal(Item v) throws Exception {

        return null; // Implement if needed

    }

}

讀取和解析所有屬性的簡單示例應用程序:XML


import org.w3c.dom.Element;

import org.w3c.dom.NamedNodeMap;

import org.w3c.dom.Node;


import javax.xml.bind.JAXBContext;

import javax.xml.bind.Unmarshaller;

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.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;


public class JaxbApp {


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

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


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


        Unmarshaller unmarshaller = context.createUnmarshaller();

        Root root = (Root) unmarshaller.unmarshal(xmlFile);


        System.out.println(root);

    }

}


@XmlRootElement(name = "root")

class Root {


    private List<Item> items = new ArrayList<>();


    @XmlElement(name = "object")

    public List<Item> getItems() {

        return items;

    }


    // getters, setters, toString

}


@XmlJavaTypeAdapter(ItemXmlAdapter.class)

class Item {


    private Map<String, String> properties;


    // getters, setters, toString

}

對于以下內容:XML


<root>

    <object att1="orgA" att2="orgA" id="6" name="N"/>

    <object att5="some" id="6" name="value"/>

</root>

指紋:


Items{items=[{name=N, id=6, att2=orgA, att1=orgA}, {name=value, att5=some, id=6}]}


查看完整回答
反對 回復 2022-09-22
  • 1 回答
  • 0 關注
  • 194 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號