使用LINQ从XML创建类,但在使用名称空间时使用TargetInvocationException
本文关键字:空间 TargetInvocationException LINQ XML 创建 使用 | 更新日期: 2023-09-27 18:09:00
我不确定这是否是最好的方法,但是我遵循了在其他一些项目中导入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,消息为"元素不是Book类型的实例"。有一个XSD映射到这个类,可能设置不对。我不确定。如果知道从哪里开始找就好了。
任何想法?
问题最终是在我的类中使用的每个XName实例(这是很多)。
// XName.Get is overloaded. If you pass two parameters, the second one is expected to be the namespace of the XML.
XName.Get("Author", "")));
而且,我的努力似乎是白费了!我刚刚发现我使用的示例是基于在这里找到的一个开源项目,在那里他们提供了一个可执行文件来为您生成这些类。好了好了。