【发布时间】:2015-08-19 21:32:55
【问题描述】:
我不确定这是否是最好的方法,但我正在遵循一个示例,该示例在其他一些项目中工作,用于导入 XML 文件并将其视为一个类。所以内容如下:
<Book>
<Author>Johnny Appleseed</Author>
</Book>
可以在 C# 中使用:
Book.Author
我使用的示例创建了一个继承 XTypedElement 的公共类,使用其 .Load 方法打开 XML,然后使用 LINQ 创建属性。比如,
public class Book: XTypedElement, IXMetaData
{
private static readonly Dictionary<XName, Type> authorDictionary = new Dictionary<XName, Type>();
private static readonly ContentModelEntity authorContent;
static Book()
{
authorDictionary .Add(XName.Get("Author", ""), typeof(string));
authorContent= new SequenceContentModelEntity(new NamedContentModelEntity(XName.Get("Author", "")));
}
public string Author
{
get
{
var x = Element(XName.Get("Author", ""));
return XTypedServices.ParseValue<string>(x, XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.String).Datatype);
}
set
{
SetElement(XName.Get("Author", ""), value, XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.String).Datatype);
}
}
public static Book Load(string xmlFile)
{
return File.Exists(xmlFile) ? XTypedServices.Load<Book>(xmlFile) : null;
}
}
这似乎工作得很好。表示复杂类型的类可以使用类似的结构嵌套。但是,一旦 XML 的根节点具有命名空间,所有这些都会中断。
<Book xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > THIS WORKS
<Book xmlns="ThisIsAValue" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > THIS DOESN'T
引发 TargetInvocationException,并显示消息“元素不是 Type Book 的实例”。 有一个映射到此类的 XSD,可能设置不正确。我不知道。很高兴知道从哪里开始寻找。
有什么想法吗?
【问题讨论】: