【问题标题】:C# XML Deserializing Error (2,2)C# XML 反序列化错误 (2,2)
【发布时间】:2011-08-09 08:12:04
【问题描述】:

学校给了我一个 XML 文档,我必须在屏幕上显示信息。据我所知,Xml 反序列化将是最简单/最好的解决方案。

到目前为止我有这个:

public static List<Project> ProjectListDeserialize(string path)
{
    XmlSerializer serializer = new XmlSerializer(typeof(List<Project>));
    Stream filestream = new FileStream(path, FileMode.Open);
    return (List<Project>)serializer.Deserialize(filestream);
}

public static Projects ProjectsDeserialize(string path)
{
    XmlSerializer serializer = new XmlSerializer(typeof(Projects));
    Stream filestream = new FileStream(path, FileMode.Open);
    return (Projects)serializer.Deserialize(filestream);
}

这就是 XML 文档的样子:

<?xml version="1.0" encoding="utf-16" ?>    
<Projects xmlns="http://www.pulse.nl/DynamicsAX/2009/DataSets" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Project ID ="1000.0001" CustomerID="1000">
        <Name>Project data key performance indicators</Name>
        <Status>WorkInProgress</Status>
        <StartDate>2011-01-01</StartDate>
        <ExpectedCompletionDate>2011-08-01</ExpectedCompletionDate>
        <CompletionDate xsi:nil="true" />
    </Project>
    <Project ID ="1000.0008" CustomerID="1000" ParentID="1000.0001">
        <Name>Implementation</Name>
        <Status>WaitListed</Status>
        <StartDate>2011-06-01</StartDate>
        <ExpectedCompletionDate>2011-08-01</ExpectedCompletionDate>
        <CompletionDate xsi:nil="true" />
    </Project>
</Projects>

两种方法都抛出相同的异常:

<Projects xmlns='http://www.pulse.nl/DynamicsAX/2009/DataSets was not expected

如何正确反序列化上述 xml?任何样本都会有所帮助!

【问题讨论】:

  • 您是否在项目/s 类定义中定义了命名空间?
  • 您应该从 Projects 元素中删除 xmlns。或编写自定义序列化程序。或使用 .NET SDK 中的 xsd 工具生成与该 Xml 格式兼容的 C# 类

标签: c# xml xml-deserialization


【解决方案1】:

问题很可能是您没有将正确的命名空间指定为Project 类的属性。

您可以告诉 XmlSerializer 在反序列化期间忽略命名空间(检查 this answer)。

或者,您可以使用XmlTypeAttribute 设置适当的命名空间:

[XmlType(Namespace = "http://www.pulse.nl/DynamicsAX/2009/DataSets")]
public class Project 
{
   ...
}

【讨论】:

  • 我能够通过结合两个给出的答案来解决这个问题,谢谢!
【解决方案2】:

尝试在XmlSerializer的构造函数中为XML文档指定default namespace

var serializer = new XmlSerializer(typeof(Projects), "http://www.pulse.nl/DynamicsAX/2009/DataSets");

相关资源:

【讨论】:

  • 我能够通过结合两个给出的答案来解决这个问题,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
相关资源
最近更新 更多