2012-09-24 21 views
6

मैं इस XML संरचना है:मिश्रित सामग्री डेटा के साथ जेएक्सबी कॉम्प्लेक्स टाइप के साथ कैसे निपटें?

<Tax> 
    <Money currency="USD">0.00</Money> 
    <Description xml:lang="en"> 
    17.5% Non-Recoverable 
    <ShortName>vatspecial</ShortName> 
    </Description> 
</Tax> 

सूचना है कि Description नोड MixedContent(पाठ और XML के साथ बना) है और इस Description नोड के बारे में XSD हिस्सा है:

<xsd:complexType name="TaxDescriptionType"> 
    <xsd:sequence> 
    <xsd:element name="ShortName" type="xsd:string" /> 
    </xsd:sequence> 
    <xsd:attribute ref="xml:lang" /> 
</xsd:complexType> 

इस बिंदु पर सबकुछ ठीक है, XJC जेनरेट आउटपुट करता है ऊपर class मैं इस तरह तत्वों के साथ आस-पास काम करने में सक्षम हूँ के साथ

package org.com.project; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlSchemaType; 
import javax.xml.bind.annotation.XmlType; 
import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 

/** 
* <p>Java class for TaxDescriptionType complex type. 
* 
* <p>The following schema fragment specifies the expected content contained within this class. 
* 
* <pre> 
* &lt;complexType name="TaxDescriptionType"> 
* &lt;complexContent> 
*  &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> 
*  &lt;sequence> 
*   &lt;element name="ShortName" type="{http://www.w3.org/2001/XMLSchema}string"/> 
*  &lt;/sequence> 
*  &lt;attribute ref="{http://www.w3.org/XML/1998/namespace}lang"/> 
*  &lt;/restriction> 
* &lt;/complexContent> 
* &lt;/complexType> 
* </pre> 
* 
* 
*/ 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "TaxDescriptionType", propOrder = { 
    "shortName" 
}) 
public class TaxDescriptionType { 

    @XmlElement(name = "ShortName", required = true) 
    protected String shortName; 
    @XmlAttribute(name = "lang", namespace = "http://www.w3.org/XML/1998/namespace") 
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class) 
    @XmlSchemaType(name = "NCName") 
    protected String lang; 

    /** 
    * Gets the value of the shortName property. 
    * 
    * @return 
    *  possible object is 
    *  {@link String } 
    *  
    */ 
    public String getShortName() { 
     return shortName; 
    } 

    /** 
    * Sets the value of the shortName property. 
    * 
    * @param value 
    *  allowed object is 
    *  {@link String } 
    *  
    */ 
    public void setShortName(String value) { 
     this.shortName = value; 
    } 

    /** 
    * Gets the value of the lang property. 
    * 
    * @return 
    *  possible object is 
    *  {@link String } 
    *  
    */ 
    public String getLang() { 
     return lang; 
    } 

    /** 
    * Sets the value of the lang property. 
    * 
    * @param value 
    *  allowed object is 
    *  {@link String } 
    *  
    */ 
    public void setLang(String value) { 
     this.lang = value; 
    } 

} 

फिर,: TaxDescriptionType के बारे में इस तरह एड कक्षाएं

taxDescriptionType.setLang("en"); 
taxDescriptionType.setShortName("vatspecial"); 
/* missing value: 17.5% Non-Recoverable */ 

लेकिन समस्या यह है कि मैं get या set17.5% Non-RecoverableMixedContent-ComplexType के ऊपर XML उदाहरण से पाठ का कोई तरीका नहीं मिला है।


यह है कि मैं क्या करने की कोशिश की है और यह काम नहीं कर रहा:

  • प्रयुक्त mixed="true" इस तरह विशेषता:

<xsd:complexType name="TaxDescriptionType" mixed="true">

(मुझे लगता है कि XJC है एल को अनदेखा करना ast विशेषता)


कुछ शोध कर रहा है, मैं इस पाया:

JAXB XJC compiler disregarding mixed=true on XML Schema documents

लेकिन मुझे यकीन है कि अगर यह इस को हल करने के तरीका है नहीं कर रहा हूँ। जवाब में से एक ने कहा कि यह एक बग है और अन्य एक में एक कोड है कि एक List<Serializable> में MixedContent बदल देती है और हो सकता है अगले स्थिति यह कैसे से निपटने के लिए के बारे में हो जाएगा पता चलता है:

taxDescriptionType.getContent().add(Serializable element); 

(और मैं वास्तव में एक Serializable तत्व से निपटने के लिए कैसे)

उत्तर

4

आप उल्लेख किया है आप संकेत मिलता है कि अपने प्रकार मिश्रित सामग्री का समर्थन करता है mixed विशेषता जोड़ने की जरूरत है पता नहीं है। बिना यह आपकी एक्सएमएल निर्दिष्ट सामग्री अमान्य है:

<xsd:complexType name="TaxDescriptionType" mixed="true"> 
    <xsd:sequence> 
     <xsd:element name="ShortName" type="xsd:string" /> 
    </xsd:sequence> 
    <xsd:attribute ref="xml:lang" /> 
</xsd:complexType> 

उत्पन्न TaxDescriptionType वर्ग निम्नलिखित संपत्ति होगा।अनिवार्य रूप से इसका मतलब है कि सभी गैर-विशेषता सामग्री List में संग्रहीत की जाएगी। यह जरूरी है क्योंकि आपको एक तंत्र की आवश्यकता है जो इंगित करता है कि पाठ नोड तत्व सामग्री को कहां लिखते हैं।

@XmlElementRef(name = "ShortName", namespace = "http://www.example.org/schema", type = JAXBElement.class) 
@XmlMixed 
protected List<Serializable> content; 

आप String के उदाहरण (का प्रतिनिधित्व पाठ नोड्स) और JAXBElement (तत्व सामग्री का प्रतिनिधित्व) के साथ इस सूची बस जाएँगे।


वैकल्पिक

मिश्रित सामग्री आम तौर पर जीवन और अधिक जटिल की तुलना में यह करने की जरूरत है बनाता है। यदि संभव हो तो मैं एक वैकल्पिक एक्सएमएल प्रतिनिधित्व की सिफारिश करता हूं।

<Tax> 
    <Money currency="USD">0.00</Money> 
    <Description xml:lang="en" ShortName="vatspecial"> 
    17.5% Non-Recoverable 
    </Description> 
</Tax> 

या

<Tax> 
    <Money currency="USD">0.00</Money> 
    <Description xml:lang="en"> 
    <LongName>17.5% Non-Recoverable</LongName> 
    <ShortName>vatspecial</ShortName> 
    </Description> 
</Tax> 
+0

क्या 'सूची' का 'Serializable' प्रकार पैरामीटर महत्वपूर्ण है? –

1

मिश्रित = सच के साथ, ObjectFactory में वहाँ JAXBElement<ShortNameType> createTaxDescriptionTypeShortNameType(ShortNameType) की तरह एक समारोह है, जो आप के लिए serializable तत्व उत्पन्न होना चाहिए।

@XmlElementDecl(namespace = "", name = "shortnametype", scope = TaxDescriptionType.class) 
    public JAXBElement<ShortNameType> createTaxDescriptionTypeShortNameType(ShortNameType value) { 
     return new JAXBElement<ShortNameType>(new QName("", "shortnametype"), ShortNameType.class, TaxDescriptionType.class, value); 
}