使用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映射到这个类,可能设置不对。我不确定。如果知道从哪里开始找就好了。

任何想法?

使用LINQ从XML创建类,但在使用名称空间时使用TargetInvocationException

问题最终是在我的类中使用的每个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", "")));

而且,我的努力似乎是白费了!我刚刚发现我使用的示例是基于在这里找到的一个开源项目,在那里他们提供了一个可执行文件来为您生成这些类。好了好了。