2010-09-03 32 views
6

यह XSD भाग से प्राप्त हुई थी: http://www.iana.org/assignments/xml-registry/schema/netconf.xsdXSD प्रारूपण <element><complexType> बनाम <complexType /><element/>

<xs:complexType name="rpcType"> 
    <xs:sequence> 
    <xs:element ref="rpcOperation"/> 
    </xs:sequence> 
    <xs:attribute name="message-id" type="messageIdType" use="required"/> 
    <xs:anyAttribute processContents="lax"/> 
</xs:complexType> 
<xs:element name="rpc" type="rpcType"/> 

और कोर NETCONF एक XML दस्तावेज के नोड होने में कॉल कार्य करने के लिए है। मैं के रूप में उत्सुक हूँ कारण है कि यह कुछ ऐसा नहीं है:

[com.sun.istack.SAXException2: unable to marshal type "netconf.RpcType" as an element because it is missing an @XmlRootElement annotation] 

मेरे पास है:

<xs:element name="rpcType"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element ref="rpcOperation"/> 
    </xs:sequence> 
    <xs:attribute name="message-id" type="messageIdType" use="required"/> 
    <xs:anyAttribute processContents="lax"/> 
    </xs:complexType> 
</xs:element> 

तर्क है कि # 1 में जब मार्शल करने के लिए एक सेम (jaxb2 में) की कोशिश कर रहा मैं अपवाद है this लेख बार-बार पढ़ रहा है, और वास्तव में अंतर को पकड़ नहीं सकता है, और यह # 1 बनाम # 2 क्यों होगा ...

उत्तर

1

काफी शामिल प्रश्न। तत्वों के बजाय प्रकारों का उपयोग करके स्कीमा डिज़ाइन करने के कई कारण हैं (इस दृष्टिकोण को वैश्विक तत्वों का उपयोग करने के लिए "वेल्मीयन टुकड़ा" बनाम "सलामी टुकड़ा" कहा जाता है)। कारणों में से एक यह है कि प्रकार उप-टाइप किए जा सकते हैं, और दूसरा यह केवल उपयोगी तत्वों के लिए उपयोगी हो सकता है जो मूल तत्व हो सकते हैं।

स्कीमा पक्ष पर कुछ और विवरणों के लिए this article देखें।

अब, विशेष रूप से जेएक्सबी प्रश्न के लिए। समस्या यह है कि आपने एक प्रकार से संबंधित वर्ग बनाया और इसे क्रमबद्ध करने की कोशिश की। इसका मतलब है कि जेएक्सबी अपने सामग्री मॉडल को जानता है, लेकिन तत्व का नाम क्या नहीं होना चाहिए। आप उदाहरण के लिए, एक तत्व (JAXBElement) करने के लिए अपने RpcType साथ जोड़ने की आवश्यकता:

marshaller.marshal(new ObjectFactory().createRpc(myRpcType)); 

ObjectFactory आप के लिए JAXB द्वारा बनाई पैकेज में रखा गया था।

11

यह स्पष्ट नहीं है, मैं आपको प्रदान करूंगा। यह प्रकार बनाम तत्व निर्णय के लिए नीचे आता है।

जब आप की तरह

<xs:element name="rpcType"> 
    <xs:complexType> 

कुछ है यह अनिवार्य रूप से एक "गुमनाम प्रकार" है, और एक प्रकार है जो कहीं भी तत्व rpcType अंदर के अलावा अन्य कभी नहीं हो सकता है। इस निश्चितता के कारण, एक्सजेसी जानता है कि उस प्रकार का नाम हमेशा rpcType होगा, और rpcType नाम के साथ @XmlRootElement एनोटेशन उत्पन्न करता है।

दूसरी ओर, जब आप

<xs:complexType name="rpcType"> 

है तो यह एक फिर से प्रयोग करने योग्य प्रकार जो संभवतः कई अलग अलग तत्वों द्वारा के लिए भेजा जा सकता है परिभाषित करता है। तथ्य यह है कि आपकी स्कीमा में इसे केवल एक तत्व द्वारा संदर्भित किया जाता है, यह अप्रासंगिक है। इस अनिश्चितता के कारण, एक्सजेसी अपने दांव को हेज करता है और @XmlRootElement उत्पन्न नहीं करता है।

जेएक्सबी संदर्भ कार्यान्वयन में एक मालिकाना एक्सजेसी ध्वज है जिसे "simple binding mode" कहा जाता है, जो कि अन्य चीजों के साथ, मानता है कि आप जिस स्कीमा को संकलित कर रहे हैं उसे कभी भी विस्तारित नहीं किया जाएगा या किसी अन्य के साथ संयुक्त नहीं किया जाएगा। यह कुछ निश्चित धारणाओं को करने की अनुमति देता है, इसलिए यदि यह complexType नामित केवल element द्वारा उपयोग किया जा रहा है, तो यह अक्सर इसके लिए @XmlRootElement उत्पन्न करेगा।

वास्तविकता उससे अधिक सूक्ष्म और जटिल है, लेकिन 90% मामलों में, यह एक पर्याप्त स्पष्टीकरण है।

+0

यदि 'सरल बाध्यकारी मोड' का उपयोग करते समय, xsd को विस्तारित या संयुक्त किया जाता है, और एक अन्य रूट तत्व को उसी प्रकार (एक्सटेंशन में) के साथ परिभाषित किया जाता है, तो एक एक्सजेसी संकलन समय त्रुटि होगी, या रनटाइम त्रुटि या अनिश्चित व्यवहार ? – Vihung

1

नाम प्रकार

एक स्कीमा वैश्विक/नामित प्रकार उपयोग करने का लाभ का लाभ है कि बच्चे/उप प्रकार बनाया जा सकता है कि माता-पिता प्रकार का विस्तार है। नामित प्रकार का एक अन्य पहलू यह है कि वे एक से अधिक तत्वों द्वारा इस्तेमाल किया जा सकता है

<xs:complexType name="myRPCType"> 
    <xs:complexContent> 
     <xs:extension base="rpcType"> 
      <xs:sequence> 
       <xs:element name="childProperty" type="xs:string"/> 
      </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

प्रभाव JAXB

पर:

<xs:complexType name="rpcType"> 
    <xs:sequence> 
     <xs:element ref="rpcOperation"/> 
    </xs:sequence> 
    <xs:attribute name="message-id" type="messageIdType" use="required"/> 
    <xs:anyAttribute processContents="lax"/> 
</xs:complexType> 
<xs:element name="rpc" type="rpcType"/> 

ऊपर टुकड़ा निम्नलिखित बच्चे प्रकार बनाया जा करने की अनुमति होगी :

<xs:element name="FOO" type="rpcType"/> 
<xs:element name="BAR" type="rpcType"/> 

इसका मतलब है टी जावा कंपाइलर को स्कीमा टोपी केवल "आरपीसी टाइप" से संबंधित वर्ग के लिए @XmlRootElement होने के संभावित तत्वों में से एक को चुन नहीं सकता है।

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