2010-12-20 7 views
24

लंबी कहानी छोटी: मैं जानना चाहता हूं कि एक्सएसडी से कुंजी/कीफ्रफ़ का उपयोग कैसे करें ताकि तत्वों को एक-दूसरे के संदर्भ मिल सकें। एक साधारण xsd और एक एक्सएमएल का उपयोग करके, इसका एक उदाहरण होना चाहिए।एक्सएमएल स्कीमा कुंजी/कीफ्रैफ़ - उनका उपयोग कैसे करें?

लंबी कहानी: मैं आईडी/आईडीआरईएफ के उपयोग से परिचित हूं। मैं उन लोगों का उपयोग जेएक्सबी के लिए तत्वों को जोड़ने के लिए करता हूं। मुझे बार-बार कहा गया है कि एक्सएसडी में कुंजी/कीफ्रैफ़ निर्माण इंटर-एलिमेंट रेफरेंसिंग के लिए लचीलापन प्रदान करता है। मैंने OReilly XML Schema book से परामर्श लिया है, जो कि कुंजी/कीफ्रफ़ की सही परिभाषा और आईडी/आईडीआरईएफ (लेकिन बेहतर) के समान कैसे है और इसके उपयोग का एक सरल उदाहरण नहीं देता है। यह समान नहीं लगता है, क्योंकि आप आईडी को एक तत्व में एक विशेषता के रूप में परिभाषित करते हैं और आईडीआरएफ को किसी अन्य तत्व और voila में परिभाषित करते हैं। लेकिन कुंजी/संदर्भित की एक आम पूर्वज और संदर्भित तत्व (AFAIK) में परिभाषित किया जाना है keyref ...

मैं XSD फ़ाइलों का उपयोग XJC साथ JAXB बाध्य जावा वर्गों उत्पन्न करने के लिए

मैं खोज की है कैसे करें, ट्यूटोरियल और उदाहरण के लिए, लेकिन गूगल मुझे स्क्रैप्स देता है। एसओ पर खोज के लिए भी (Google के साथ और '+' के साथ समावेशी खोज के साथ भी)।

हर किसी के जीवन को आसान बनाने के लिए मैंने पहले से परिभाषित कुंजी/कीफ्रफ़ जोड़ी के साथ एक एक्सएसडी तैयार किया है जैसा कि मैंने इसे समझा है।

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="referenced"> 
       <xs:complexType> 
        <xs:attribute name="id" type="xs:string" /> 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="owner"> 
       <xs:complexType> 
        <xs:attribute name="id" type="xs:string" /> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:key name="aKey"> 
     <xs:selector xpath="owner" /> 
     <xs:field xpath="@id" /> 
    </xs:key> 
    <xs:keyref name="aKeyRef" refer="aKey"> 
     <xs:selector xpath="referenced" /> 
     <xs:field xpath="@id" /> 
    </xs:keyref> 
</xs:element> 

कैसे एक्सएमएल का एक टुकड़ा एक 'owner' तत्व एक संदर्भित' referenced'-तत्व के साथ की तरह, विचार करेंगे?

संपादित करें: ने टॉम डब्ल्यू द्वारा प्रस्तावित परिवर्तन को लागू किया, मुख्य तत्व के xpath विशेषता को "स्वामी" में बदल दिया। जेएक्सबी (एक्सजेसी) अभी भी परवाह नहीं करता है।

धन्यवाद

उत्तर

6

उदाहरण दस्तावेज़ में कोई विशेष वाक्यविन्यास नहीं है। यह बस आवश्यक है कि keyref नोड एक मौजूदा कुंजी नोड से मेल खाता है। प्रमाणीकरण आपको बताएगा कि महत्वपूर्ण बाधा संतुष्ट है या नहीं।

अपने कोड पुन:

मैं केवल अभी कुंजी के साथ अपने आप को dabbling शुरू कर दिया है, लेकिन मुझे लगता है कि मैं तुम्हारा में एक त्रुटि देखा गया है - aKey दिखना चाहिए:

<xs:key name="aKey"> 
    <xs:selector xpath="owner" /> 
    <xs:field xpath="@id" /> 
</xs:key> 

इसके अलावा - यह एक गॉचाचा है - मुख्य बाधाएं डिफ़ॉल्ट नामस्थान को पहचान नहीं देती हैं। आपको जिस तत्व को आप देख रहे हैं उसके नामस्थान उपसर्ग के साथ आपको हमेशा selector xpath के प्रत्येक भाग को उपसर्ग करना होगा। यदि आपके पास नेमस्पेस उपसर्ग नहीं है - कठिन, आपको एक जोड़ना होगा। यह मानक की एक सीमा है।

+0

आह, यही कारण है कि इसमें कोई विशेषता शामिल नहीं है। मैंने आपके द्वारा बताए गए परिवर्तन को लागू किया है, लेकिन JAXB मालिक से संदर्भित तत्व तक पहुंचने में सक्षम होने के लिए कुछ भी उत्पन्न नहीं करता है - पूरे कुंजी/कीफ्रफ़ भाग का मानचित्रण पर कोई प्रभाव नहीं पड़ता है। क्या वहां कुछ और है जो मुझे याद आ रही है? – kostja

+0

मेरा कहना था कि एक्सजेसी उत्पन्न नहीं करता है ... – kostja

+0

शायद मुझे उपरोक्त पोस्ट में जो कह रहा है उसे स्पष्ट करना चाहिए। मुझे नहीं पता कि जेएक्सबी क्या है, लेकिन इससे कोई फर्क नहीं पड़ता - मैं जो कहने की कोशिश कर रहा हूं वह यह है कि <मालिक अन्य इटैम = "1" /> ... <अन्य इटिम आईडी = "1" />। क्या आपको मुख्य संबंध व्यक्त करने की आवश्यकता है, उदाहरण के लिए विशेष रूप से एक महत्वपूर्ण संबंध घोषित करने के लिए कोई XML सिंटैक्स नहीं है। मुझे लगता है कि आपका मतलब यह है कि आप एक फ्रेमवर्क का उपयोग कर रहे हैं जिसे एक्सएमएल फाइलों के लिए ओआरएम के रूप में कार्य करना है, इस मामले में आप कुछ सार्थक आउटपुट की उम्मीद कर सकते हैं, इस मामले में, कुंजी और कीफ के दायरे के साथ खेलने का प्रयास करें उन्हें चारों ओर ले जा रहा है। –

2

जेएक्सबी xs:key या xs:keyref के माध्यम से संदर्भों का समर्थन नहीं करता है। विनिर्देश बताता है कि सत्यापन के दौरान इन बाधाओं की जांच की जा सकती है, लेकिन उनके डेटा पर कोई प्रभाव नहीं पड़ता है।

हालांकि, आप इसके बजाय xs:ID और xs:IDREF का उपयोग करके यह (अधिक या कम) प्राप्त कर सकते हैं। एक परिचय के लिए, वुल्फगैंग लॉन द्वारा जे AXB Tutorial में अध्याय 2.2.15 Referring to Another XML Element और 4.3 Assembling Data with Links (ID, IDREF) देखें।

अपने नमूना XSD के लिए, यह करने के लिए

<xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="referenced"> 
       <xs:complexType> 
        <xs:attribute name="id" type="xs:ID" /> 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="owner"> 
       <xs:complexType> 
        <xs:attribute name="id" type="xs:IDREF" /> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

ध्यान दें कि xs:ID प्रकार के साथ पहचानकर्ता XML दस्तावेज में वैश्विक रूप से अद्वितीय होना भी आवश्यक है तत्व परिभाषा बदल रहा है, जिसका अर्थ है जाएगा। दूसरे शब्दों में, आपके पास एक ही एक्सएमएल फ़ाइल में दो अलग-अलग तत्वों के लिए एक ही आईडी नहीं हो सकती है, भले ही तत्व विभिन्न प्रकार के हों।

डिफ़ॉल्ट रूप से, xs:IDREF प्रकार का तत्व या विशेषता java.lang.Object पर बाध्य होती है। यदि आप पहले से जानते हैं कि संदर्भित ऑब्जेक्ट किस प्रकार का होगा, तो आप स्कीमा में या बाहरी बाध्यकारी घोषणा (उदाहरण के लिए, xjc -b bindings.xjb) के माध्यम से जेएक्सबी एनोटेशन जोड़कर मैपिंग को कस्टमाइज़ कर सकते हैं।

उदाहरण का उपयोग करते हुए JAXB स्कीमा एनोटेशन (नहीं परीक्षण किया):

<xs:element name="owner"> 
    <xs:complexType> 
     <xs:attribute name="id" type="xs:IDREF"> 
      <xs:annotation> 
       <xs:appinfo> 
        <jaxb:property> 
         <jaxb:baseType name=”SomeType”/> 
        </jaxb:property> 
       </xs:appinfo> 
      </xs:annotation> 
     </xs:attribute> 
    </xs:complexType> 
</xs:element> 

उदाहरण एक बाहरी बाइंडिंग घोषणा (नहीं परीक्षण किया) का उपयोग:

<jaxb:bindings node="//xs:element[@name=’owner’]//xs:attribute[@name='id']”> 
    <jaxb:property> 
     <jaxb:basetype name="SomeType"/> 
    </jaxb:property> 
</jaxb:bindings> 
+0

** मार्कस्क ** ने उत्तर दिया है कि मैंने स्पष्ट रूप से नहीं पता था लेकिन अनुमान लगाया कि मामला क्या है। बशर्ते आप अपने व्यापार डेटा में इन बाधाओं को लागू करने के लिए सत्यापन पर भरोसा कर सकें, मुझे नहीं लगता कि चाबियों का उपयोग करना एक समस्या होनी चाहिए, लेकिन इससे मुझे लगता है कि जेएक्सबी आपकी मदद नहीं करेगा। सौभाग्य! –

+0

धन्यवाद। ऐसा लगता है कि अब मैं सामान कर रहा हूं :) यह ठीक काम करता है, लेकिन टाइप सुरक्षा की भ्रम भी आपको ऑब्जेक्ट से वास्तविक संदर्भ वर्ग में जेनरेट किए गए मालिक वर्गों में संदर्भों को मैन्युअल रूप से बदलना होगा। और असली प्रकार की सुरक्षा के लिए कोई रास्ता नहीं है। इस तरह से बेकार है, मैं वास्तव में इसे लागू करना चाहता हूं और सोचा कि यह कुंजी/कीफ – kostja

+0

@ कोस्टजा के माध्यम से संभव होगा: आप संदर्भ वर्ग निर्दिष्ट करने के लिए जेएक्सबी मैपिंग को कस्टमाइज़ कर सकते हैं। मैंने अपना जवाब अपडेट नहीं किया है (अनचाहे) नमूने कैसे करें इसे कैसे करें। – markusk

5

JAXB कल्पना स्पष्ट रूप से कुंजी/keyref कवर नहीं करता। हालांकि EclipseLink MOXy (मैं तकनीकी लीड हूं) के लिए जेएक्सबी लागू करने के लिए एक्सटेंशन हैं। हमारी आगामी 2.2 रिलीज एनोटेशन के माध्यम से इस प्रकार के रिश्ते को निर्दिष्ट करने का माध्यम प्रदान करती है (मैं एक उदाहरण एक साथ रखूंगा)। वर्तमान रिलीज का उपयोग करके इसे कैसे किया जा सकता है इसका एक लिंक नीचे दिया गया है।

अधिक जानकारी के लिए देखें:

अद्यतन

मैं एक उदाहरण के जवाब के साथ शामिल पाने के लिए उम्मीद कर रहा था, लेकिन मैं समय से बाहर चला रहा हूँ छुट्टी पर जाने से पहले। - <xs:key> तत्व का एक सरल उपयोग का उदाहरण देखने

+0

धन्यवाद, यह आशाजनक लग रहा है। मैं वास्तव में आपके उदाहरण की प्रतीक्षा कर रहा हूं – kostja

4

मैं इस सूत्र एक ही बात ओपी लिए खोज रहा था के लिए खोज पाया: नीचे हमारे डिजाइन दस्तावेजों से एक उदाहरण है कि अवधारणा को दर्शाता है है। सभी जेएक्सबी सामान मेरे लिए ग्रीक थे, और एक व्याकुलता। बाद में इस सूत्र खोजने दूसरों के लिए, यहाँ एक सरल उदाहरण MSDN पर तैनात है कुछ वर्षों के बाद ओपी यहाँ प्रश्न पूछा इतने पर:

https://msdn.microsoft.com/en-us/library/ms256101%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

मामले में MSDN लिंक परिवर्तन, ब्रेडक्रंब पथ था:

https://msdn.microsoft.com/library उसके बाद "पुस्तकालय टीओसी दृश्य में स्विच करें", और के माध्यम से अंदर घुसते हैं:

MSDN लाइब्रेरी> नेट विकास> .NET फ्रेमवर्क 4.6 और 4.5> विकास गाइड> डेटा और मॉडलिंग> एक्सएमएल मानक संदर्भ> XML स्कीमा (एक्सएसडी) संदर्भ> एक्सएमएल स्कीमा तत्व> < xsd: कुंजी> तत्व

1

कृपया, यह key/keyref tutorial देखने का प्रयास करें।

रंगीन पाठ बहुत उपयोगी है।

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