2011-03-15 17 views
6

मैं अब थोड़ी देर के लिए JAXB के साथ लगभग नगण्य किया गया है, मैं और तरहजेएक्सबी के साथ हैशपैप गुणों का उपयोग कैसे करें?

नीचे
<Root attr1="" attr2="" .. attrn="" > 
    <CNode attr1="" attr2="" /> 
    . 
    . 
    . 
    <CNode .. /> 
</Root> 

रूट तत्व के गुण गतिशील है एक्सएमएल उत्पन्न करने के लिए की जरूरत है या तो एक गुण फ़ाइल या एक टेम्पलेट से आएगा। ऊपर दिखाए गए ढांचे में इसे पाने का सबसे अच्छा तरीका क्या है? मैं गतिशील चर के लिए HashMaps उपयोग कर रहा हूँ और उसके बाद XmlJavaTypeAdapter के साथ मानचित्रण की कोशिश की, सबसे अच्छा मैं कर सकता

<Root> 
    <Attribs> 
     <entry key="attr1">Value</entry> 
    </Attribs> 
    <CNode .. /> 
</Root> 

है वहाँ JAXB में एक तरह से कहने के लिए विशेषता नाम के रूप में उपयोग hashmap के प्रमुख और उस कुंजी के लिए मूल्य है xml में उस विशेषता के मान के रूप में? या यदि आपको लगता है कि ऐसा करने का एक बेहतर तरीका है, तो मैं सुझावों के लिए खुला हूं। मैं रूट नोड को अलग से जोड़ने के लिए जैक्सब के मार्शलर का उपयोग करने के बारे में काफी सोच रहा हूं। हालांकि अगर मैं सिर्फ जैक्सबी एडाप्टर का उपयोग कर सकता हूं तो यह अच्छा होगा। धन्यवाद!

+0

किसी भी सुझाव लोग? – opensourcegeek

उत्तर

6

@XmlAnyAttribute आपको क्या चाहिए की तर्ज पर है:

रूट

import java.util.List; 
import java.util.Map; 

import javax.xml.bind.annotation.XmlAnyAttribute; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.namespace.QName; 

@XmlRootElement(name="Root") 
public class Root { 

    private Map<QName, String> extension; 
    private List<CNode> cnodes; 

    @XmlAnyAttribute 
    public Map<QName, String> getExtension() { 
     return extension; 
    } 

    public void setExtension(Map<QName, String> extension) { 
     this.extension = extension; 
    } 

    @XmlElement(name="CNode") 
    public List<CNode> getCnodes() { 
     return cnodes; 
    } 

    public void setCnodes(List<CNode> cnodes) { 
     this.cnodes = cnodes; 
    } 

} 

CNode

import java.util.Map; 
import javax.xml.bind.annotation.XmlAnyAttribute; 
import javax.xml.namespace.QName; 

public class CNode { 

    private Map<QName, String> extension; 

    @XmlAnyAttribute 
    public Map<QName, String> getExtension() { 
     return extension; 
    } 

    public void setExtension(Map<QName, String> extension) { 
     this.extension = extension; 
    } 

} 

डेमो

import java.io.File; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 
import javax.xml.bind.Unmarshaller; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Root.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     Root root = (Root) unmarshaller.unmarshal(new File("input.xml")); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(root, System.out); 
    } 

} 

input.xml

<?xml version="1.0" encoding="UTF-8"?> 
<Root att1="A" att2="B"> 
    <CNode att3="C" att4="D"/> 
    <CNode att5="E" att6="F"/> 
</Root> 
+1

धन्यवाद ब्लेज़, मैंने डोम और जेएक्सबी दोनों का उपयोग करके कुछ लिखा - यह एक बहुत साफ दृष्टिकोण है। चीयर्स! – opensourcegeek

संबंधित मुद्दे