我正在开发一个项目,将多个文档源转换为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.
...";
}
}