2012-03-12 8 views
28

나는 YamlDotNet 라이브러리와 함께 일하고 있어요 및 YAML 파일을로드 할 때이 오류 받고 있어요 :YAML에서 단일 느낌표는 무엇을합니까?

태그를 구문 분석하는 동안, 예상 찾지 못했습니다 태그 URI를.

YAML 파일은 right from RoR이되므로 올바른 형식이어야합니다. 이 오류는이 코드에 의해 트리거 될 것으로 보인다 : 나는 전문가가 아니에요

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

,하지만 난 당신이 사용자 지정 개체/유형을 표시하는 느낌표를 사용할 수있는 YAML 사양에서 볼, 2 개의 느낌표 명시 적 내장 유형을 나타냅니다.

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

그러나 위에 사용 된 느낌표에 대한 참조를 찾을 수 없었습니다. 이것이 의미하는 바는 무엇이며 YAML 라이브러리를 사용하여 왜 구문 분석 할 수없는 것일까? 그 느낌표를 제거하면 파일이 잘 파싱됩니다.

답변

36

"!" "비 특정 태그"입니다. (또한 1.1)

YAML specification 1.2 숙박 : "!"

명시 적으로 비 특정 태그의 속성을 지정하여이 노드 는, 는 "바닐라"순서, 매핑, 또는 문자열로 해결 될 것 그 종류에 따라.

태그 "문법"에 here을 살펴 보자 : 왜 YamlDotNet이 오류를 던지고있다

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"). 

? 나는 100 % 확신 할 수는 없지만 당신이 버그를 발견했다고 생각합니다.

YamlDotNet은 LibYAML 포트이므로 소스를 비교하기 쉽습니다. scanner.c의

라인 2635 (LibYAML) : Scanner.cs (YamlDotNet)의

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

라인 2146 : 내가 아는

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

은 모두이 시점에서하지만, 매우 비슷합니다 length은 1이고 tag.Length은 0입니다. 원래의 C 코드는 초기 "!" (전체 길이)하지만 C# (그냥 태그 "이름"길이) 그것을하지 않습니다.

프로젝트에 문제를 신고하십시오.

+0

수표에 댓글을 달아서 문제가 해결 된 것으로 보이지만 다른 구조에 미치는 영향에 대해서는 잘 모릅니다. 나는 어쨌든 프로젝트에 버그를 제기했다. –

+1

앞에 느낌표를 사용하는 대신 전체 문자열을 따옴표로 묶는 것이 동일합니까? – Magne

+1

사양에 대한 링크가 고정되어야합니다 (1.1 - 1.2, 1.2 - 1.1 링크). – kovpack

관련 문제