2012-03-12 44 views
28

Tôi đang làm việc với thư viện YamlDotNet và tôi nhận được lỗi này khi tải một file YAML: thẻDấu chấm than đơn trong YAML là gì?

Trong khi phân tích một thẻ, không tìm thấy dự kiến ​​URI.

Tệp YAML được cho là được tạo đúng bởi vì nó đến right from RoR. Lỗi này có vẻ được kích hoạt bởi mã này:

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

Tôi không phải là một chuyên gia, nhưng tôi thấy từ spec YAML mà bạn có thể sử dụng một dấu chấm than để chỉ một đối tượng tùy chỉnh/loại, và hai dấu chấm than để biểu thị loại được xây dựng rõ ràng.

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

Tuy nhiên tôi chưa thể tìm thấy bất kỳ tham chiếu nào đến dấu chấm than được sử dụng như trên. Điều đó có nghĩa là gì và tại sao thư viện YAML mà tôi sử dụng lại không có khả năng phân tích nó? Lưu ý rằng nếu tôi xóa các dấu chấm than đó, tệp sẽ được phân tích cú pháp.

Trả lời

36

Đó là "!" là "thẻ không cụ thể".

YAML specification 1.2 trú (cũng 1.1): “!”

Bằng cách xác định một cách rõ ràng sở hữu thẻ không đặc hiệu, nút sau đó sẽ được giải quyết cho một “vanilla” chuỗi, lập bản đồ, hoặc chuỗi, theo loại của nó.

Hãy xem here cho thẻ "ngữ pháp":

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

Tại sao YamlDotNet ném một lỗi? Tôi không thể chắc chắn 100%, nhưng tôi nghĩ bạn đã tìm thấy một lỗi.

YamlDotNet là cổng LibYAML, vì vậy thật dễ dàng so sánh các nguồn.

Dòng 2635 của scanner.c (LibYAML):

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

Dòng 2146 của Scanner.cs (YamlDotNet):

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

tôi biết, cả hai trông rất giống nhau, nhưng vào thời điểm này length là 1 và tag.Length là 0. Mã C ban đầu sẽ xử lý "!" Ban đầu (toàn bộ chiều dài) nhưng C# không làm điều đó (chỉ là thẻ "tên" chiều dài).

Gửi sự cố cho dự án.

+0

Nhận xét kiểm tra có vẻ như khắc phục được sự cố, nhưng tôi không có ý tưởng về hiệu ứng của nó trên các cấu trúc khác. Tôi đã nộp một lỗi trên dự án anyway. –

+1

nó sẽ tương đương với quấn toàn bộ chuỗi trong dấu ngoặc kép thay vì sử dụng dấu chấm than đơn ở phía trước? – Magne

+1

liên kết đến thông số kỹ thuật phải được cố định (1.1 - liên kết tới 1,2, 1,2 - liên kết tới 1,1) – kovpack

Các vấn đề liên quan