使用YamlDotNet反序列化MkDocs.yml页面对象

时间:2017-06-30 18:34:54

标签: deserialization yaml yamldotnet mkdocs

我正在开发一个项目,将多个文档源转换为MkDocs项目。 MkDocs项目文件MkDocs.yml是一个YAML文档。我需要对现有页面进行反序列化,以便通过C#控制台应用程序在该项目中插入新的.md页面和标题。

示例MkDocs.yml文件

site_name: Knowledge Base
theme: readthedocs
pages:
- Home: 'index.md'
- User Guide:
    - 'Writing your docs': 'user-guide/writing-your-docs.md'
    - 'Styling your docs': 'user-guide/styling-your-docs.md'
- About:
    - 'License': 'about/license.md'
    - 'Release Notes': 'about/release-notes.md'

我使用YamlDotNet提供的DeserializeObjectGraph单元测试来测试页面反序列化。测试总是因此异常而失败:

执行附加单元测试时产生的异常

Message: YamlDotNet.Core.YamlException : (Line: 8, Col: 15, Idx: 214) - (Line: 8, Col: 15, Idx: 214): Exception during deserialization
---- System.Runtime.Serialization.SerializationException : Property 'Home' not found on type 'YamlDotNet.Samples.DeserializeObjectGraph+Page'.

我猜测我需要在Page类或其中一个属性上放置某种类型的属性。有没有人有任何反序列化与此类似的结构的经验?如果是这样,您可以发布样本给我一些参考吗?

这里是我使用的输入DeserializeObjectGraph.cs:

using System;
using System.Collections.Generic;
using System.IO;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;
using YamlDotNet.Samples.Helpers;
using Xunit.Abstractions;

namespace YamlDotNet.Samples
{
    public class DeserializeObjectGraph
    {
        private readonly ITestOutputHelper output;

        public DeserializeObjectGraph(ITestOutputHelper output)
        {
            this.output = output;
        }

        [Sample(
            DisplayName = "Deserializing an object graph",
            Description = "Shows how to convert a YAML document to an object graph."
        )]
        public void Main()
        {
            var input = new StringReader(Document);

            var deserializer = new DeserializerBuilder()
                .WithNamingConvention(new CamelCaseNamingConvention())
                .Build();

            var order = deserializer.Deserialize<Order>(input);

            output.WriteLine("Order");
            output.WriteLine("-----");
            output.WriteLine();
            foreach (var item in order.Items)
            {
                output.WriteLine("{0}\t{1}\t{2}\t{3}", item.PartNo, item.Quantity, item.Price, item.Descrip);
            }
            output.WriteLine();

            output.WriteLine("Shipping");
            output.WriteLine("--------");
            output.WriteLine();
            output.WriteLine(order.ShipTo.Street);
            output.WriteLine(order.ShipTo.City);
            output.WriteLine(order.ShipTo.State);
            output.WriteLine();

            output.WriteLine("Billing");
            output.WriteLine("-------");
            output.WriteLine();
            if (order.BillTo == order.ShipTo)
            {
                output.WriteLine("*same as shipping address*");
            }
            else
            {
                output.WriteLine(order.ShipTo.Street);
                output.WriteLine(order.ShipTo.City);
                output.WriteLine(order.ShipTo.State);
            }
            output.WriteLine();

            output.WriteLine("Delivery instructions");
            output.WriteLine("---------------------");
            output.WriteLine();
            output.WriteLine(order.SpecialDelivery);
        }

        public class Order
        {
            public string Receipt { get; set; }
            public DateTime Date { get; set; }
            public Customer Customer { get; set; }
            public List<OrderItem> Items { get; set; }

            [YamlMember(Alias = "bill-to", ApplyNamingConventions = false)]
            public Address BillTo { get; set; }

            [YamlMember(Alias = "ship-to", ApplyNamingConventions = false)]
            public Address ShipTo { get; set; }
            public List<Page> Pages { get; set; }

            public string SpecialDelivery { get; set; }
        }
        public class Page
        {
            public Dictionary<string, string> link;

        }
        public class Customer
        {
            public string Given { get; set; }
            public string Family { get; set; }
        }

        public class OrderItem
        {
            [YamlMember(Alias = "part_no", ApplyNamingConventions = false)]
            public string PartNo { get; set; }
            public string Descrip { get; set; }
            public decimal Price { get; set; }
            public int Quantity { get; set; }
        }

        public class Address
        {
            public string Street { get; set; }
            public string City { get; set; }
            public string State { get; set; }
        }

        private const string Document = @"---
            receipt:    Oz-Ware Purchase Invoice
            date:        2007-08-06
            customer:
                given:   Dorothy
                family:  Gale

            pages:
            - Home: 'index.md'
            - User Guide:
                - 'Writing your docs': 'user-guide/writing-your-docs.md'
                - 'Styling your docs': 'user-guide/styling-your-docs.md'
            - About:
                - 'License': 'about/license.md'
                - 'Release Notes': 'about/release-notes.md'

            items:
                - part_no:   A4786
                  descrip:   Water Bucket (Filled)
                  price:     1.47
                  quantity:  4

                - part_no:   E1628
                  descrip:   High Heeled ""Ruby"" Slippers
                  price:     100.27
                  quantity:  1

            bill-to:  &id001
                street: |-
                        123 Tornado Alley
                        Suite 16
                city:   East Westville
                state:  KS

            ship-to:  *id001

            specialDelivery: >
                Follow the Yellow Brick
                Road to the Emerald City.
                Pay no attention to the
                man behind the curtain.
...";
    }
}

0 个答案:

没有答案