2012-03-12 14 views
28

मैं YamlDotNet पुस्तकालय के साथ काम कर रहा हूँ और जब एक YAML फ़ाइल लोड हो रहा है मैं इस त्रुटि हो रही है:वाईएएमएल में एक विस्मयादिबोधक चिह्न क्या करता है?

एक टैग को पार्स करते हुए उम्मीद नहीं मिला टैग यूआरआई।

वाईएएमएल फ़ाइल अच्छी तरह से बनाई जानी चाहिए क्योंकि यह right from RoR आता है। त्रुटि इस कोड से शुरू हो रहा प्रतीत हो रहा है:

formats: 
    default: ! '%d-%m-%Y' 
    long: ! '%d %B, %Y' 
    short: ! '%d %b' 

मैं एक विशेषज्ञ नहीं हूँ, लेकिन मैं YAML कल्पना है कि आप एक कस्टम वस्तु/प्रकार इंगित करने के लिए एक विस्मयादिबोधक चिह्न का उपयोग कर सकते से देखते हैं, और दो विस्मयादिबोधक चिह्न स्पष्ट अंतर्निहित प्रकार को इंगित करने के लिए।

obj1: !custom # whatever 
obj2: !!str "My string" 

हालांकि मैं उपरोक्त के रूप में उपयोग किए गए विस्मयादिबोधक चिह्न का कोई संदर्भ नहीं ढूंढ पाया। इसका क्या अर्थ है, और क्यों उपयोग की जाने वाली वाईएएमएल लाइब्रेरी इसे पार्स करने में सक्षम नहीं है? ध्यान दें कि यदि मैं उन विस्मयादिबोधक चिह्नों को हटा देता हूं, तो फ़ाइल को ठीक से पार्स किया जाता है।

उत्तर

36

कि "!" "गैर-विशिष्ट टैग" है।

YAML specification 1.2 रहता है (यह भी 1.1): "!"

स्पष्ट रूप से एक गैर विशिष्ट टैग संपत्ति निर्दिष्ट करके, नोड तो, एक "वैनिला" अनुक्रम, मानचित्रण, या स्ट्रिंग का संकल्प किया जाएगा अपनी तरह के अनुसार।

एक नजर डालें टैग "व्याकरण" करने के लिए here:

none : Unspecified tag (automatically resolved by application). 
'!'  : Non-specific tag (by default, "!!map"/"!!seq"/"!!str"). 
'!foo' : Primary (by convention, means a local "!foo" tag). 
'!!foo' : Secondary (by convention, means "tag:yaml.org,2002:foo"). 
'!h!foo': Requires "%TAG !h! <prefix>" (and then means "<prefix>foo"). 
'!<foo>': Verbatim tag (always means "foo"). 

क्यों YamlDotNet एक त्रुटि फेंक रहा है? मैं 100% सुनिश्चित नहीं हो सकता, लेकिन मुझे लगता है कि आपको एक बग मिला है।

YamlDotNet LibYAML के एक बंदरगाह है, तो यह स्रोतों की तुलना में आसान है।

scanner.c रेखा 2635 (LibYAML):

/* Check if the tag is non-empty. */ 
if (!length) { 

Scanner.cs (YamlDotNet) की लाइन 2146:

// Check if the tag is non-empty. 
if (tag.Length == 0) 

मुझे पता है, दोनों बहुत समान दिखता है, लेकिन इस बिंदु पर length 1 है और tag.Length 0. मूल सी कोड प्रारंभिक का ख्याल रखता है कि "!" (पूरी लंबाई) लेकिन सी # ऐसा नहीं करता है (बस टैग "नाम" लंबाई)।

फ़ाइल परियोजना के लिए एक मुद्दा।

+0

जांच टिप्पणी करते हुए इस समस्या को ठीक करने लगता है, लेकिन मैं अन्य निर्माणों पर उसके प्रभाव के बारे में पता नहीं है। मैंने परियोजना पर एक बग दायर किया है। –

+1

क्या यह सामने वाले एकल विस्मयादिबोधक चिह्न का उपयोग करने के बजाय संपूर्ण स्ट्रिंग को उद्धरण चिह्नों में लपेटने के बराबर होगा? विनिर्देशों के लिए – Magne

+1

लिंक किया जाना चाहिए (1.1 - 1.2 लिंक, 1.2 - 1.1 के लिए लिंक) – kovpack

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