47

YamlDotNetライブラリを使用していますが、YAML ファイルをロードするときに次のエラーが発生します。

タグの解析中に、予期されたタグ URI が見つかりませんでした。

YAML ファイルはRoR から直接取得されるため、整形式であると想定されています。エラーは、次のコードによってトリガーされるようです。

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

私は専門家ではありませんが、YAML 仕様から、感嘆符を使用してカスタム オブジェクト/型を示し、2 つの感嘆符を使用して明示的な組み込み型を示すことができることがわかります。

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

ただし、上記のように使用されている感嘆符への参照を見つけることができませんでした。それはどういう意味ですか? また、私が使用している YAML ライブラリがそれを解析できないように見えるのはなぜですか? これらの感嘆符を削除すると、ファイルは正常に解析されることに注意してください。

4

1 に答える 1

61

それ!非固有タグです。

YAML 仕様 1.2 (および以前の1.1 ) は、次のように述べています。

「!」を明示的に指定することによって 非固有のタグ プロパティである場合、ノードはその種類に応じて、「バニラ」シーケンス、マッピング、または文字列に解決されます。

ここでタグ「grammar」を見てください。

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.Length0 です。元の C コードは最初の "!" を処理します。(全体の長さ) しかし、C# はそれを行いません (タグの「名前」の長さだけ)。

プロジェクトに課題を提出します。

于 2012-03-14T14:03:45.417 に答える