2017-12-01 1 views
1

に動的な要素に動的な属性を追加し、
する方法、 はアドオンで助けを必要とすることは、動的要素を作成する属性。今 属性なしダイナミックな要素を作成することができ、動的属性を持つ任意の要素を作成しようとしていJAXB

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

      myElements.put("connectmrf ",""); 
       setElements(myElements,"www.xxxxx.xxx/xxx/vmas"); 

      Map<QName, String> attr=new HashMap<QName,String>(); 
       attr.put(new QName("Name"),"Amit"); 
       attr.put(new QName("age"),"10"); 

       setAttr(attr); 

現在の結果セット

public class CustomElement { 


     private List<JAXBElement<String>> Elements; 


     @XmlAnyElement 
     public List<JAXBElement<String>> getElements() { 
      return Elements; 
     } 

     public void setElements(List<JAXBElement<String>> elements) { 
      Elements = elements; 
     } 


     public void setElements(Map<String, String> myElements, String namespaceURI) { 

       List<JAXBElement<String>> elements = new ArrayList<JAXBElement<String>>(); 
       for (Map.Entry<String, String> mapElement: myElements.entrySet()) 
       {    
        JAXBElement jAXBElement=new JAXBElement(new QName(namespaceURI,mapElement.getKey()), 
          String.class, mapElement.getValue()); 

        elements.add(jAXBElement); 
       } 
      Elements = elements; 
     } 

//not working attr added to parent element not to current element 
    private Map<QName, String> attr; 

     @XmlAnyAttribute 
     public Map<QName, String> getAttr() { 
      return attr; 
     } 

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

    } 

怒鳴る作成した動的な要素:

 <state age="10" Name="Amit"> 
      <vmas:connectmrf ></vmas:connectmrf > 
     </state> 

期待される結果:

 <state> 
      <vmas:connectmrf age="10" Name="Amit" ></vmas:connectmrf > 
     </state> 
を提案してくださいを

答えて

1

警告!:これは唯一のあなたが@XmlAnyAttributeでラッパークラスを作成する必要が

をマーシャリングのための迅速かつ汚い方法です。たとえば

public class AnyXmlElement { 
    @XmlAnyAttribute 
    private Map<QName, String> attributes; 
    @XmlAnyElement 
    private List<Object> elements; 

    public AnyXmlElement() { 
     attributes = new LinkedHashMap<QName, String>(); 
     elements = new ArrayList<Object>(); 
    } 

    public void addAttribute(QName name, String value) { 
     attributes.put(name, value); 
    } 

    public void addElement(Object element) { 
     elements.add(element); 
    } 
} 

は、我々は簡単なルートクラス

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public static class Root { 
    @XmlAnyElement 
    public List<Object> any; 
} 

とプログラムを作成するテストのためにJAXBElement

public static JAXBElement<AnyXmlElement> toJAXBElement(QName qName, AnyXmlElement any) { 
    return new JAXBElement<AnyXmlElement>(qName, AnyXmlElement.class, any); 
} 

AnyXmlElementをラップすることにより、動的な名前を確認してください

public static void main(String[] args) throws Exception { 
    AnyXmlElement any = new AnyXmlElement(); 
    any.addAttribute(new QName("bar"), "hello"); 

    Root root = new Root(); 
    root.any = Arrays.asList(toJAXBElement(new QName("foo"), any)); 
    // It's important to add AnyXmlElement.class here 
    JAXBContext jc = JAXBContext.newInstance(Root.class, AnyXmlElement.class); 
    Marshaller m = jc.createMarshaller(); 
    m.marshal(root, System.out); 
} 

これは、生成されたXMLです:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><root><foo bar="hello world"/></root> 
+0

AnyXmlElementクラスはaddElementメソッドでは約いくつかの情報を必要とするには、使用権ではないか、それが子要素のためにあるのですか? – Tamkeen

+0

'addElement()'と 'List elements'は必須ではありませんが、完全に動的なラッパークラスを提供するために含まれているので、' AnyXmlElement'とルートクラスのみで完全なxmlファイルを作成できます。 – devpuh

関連する問題