【问题标题】:Creating class from XML using LINQ, but TargetInvocationException when using namespace使用 LINQ 从 XML 创建类,但使用命名空间时出现 TargetInvocationException
【发布时间】: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,可能设置不正确。我不知道。很高兴知道从哪里开始寻找。

有什么想法吗?

【问题讨论】:

    标签: c# xml linq xsd


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 2011-03-17
      • 2016-01-01
      • 1970-01-01
      • 2011-01-21
      相关资源
      最近更新 更多