XML 文档错误 (2,2)

问题描述 投票:0回答:4

我有一些 xml 文件,我正在尝试在给定代码中按以下方式反序列化。

using (StreamReader srFileContent = new StreamReader(filePath))  
{
    XmlSerializer serializer = new XmlSerializer(typeof(messageType));   
    messageType objMessage = (messageType)serializer.Deserialize(srFileContent);  
}

这里 file locate at filePath 不包含以下行

<?xml version="1.0"?>
<message xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">

这就是我收到错误的原因。你能帮我在反序列化给定文件的流之前如何添加这行运行时吗?

错误如下:

System.InvalidOperationException: XML 文件有错误 (2, 2)。 ---> System.InvalidOperationException: 是 没有预料到。在 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReadermessageType.u200c Read161_message() --- 内部异常堆栈跟踪结束 --- 在 System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader、String encodingStyle、XmlDeserializationEvents 事件)在 System.Xml.Serialization.XmlSerializer.Deserialize(TextReader 文本阅读器)在 CCR2BB.frmMain.BWConvertProcess_DoWork()

c# xml-serialization
4个回答
14
投票

您将不得不查看基本异常以找出问题所在。捕获的异常可能包含 4 个或更多内部异常。

EG:

try
{
  ...
}
catch (Exception ex)
{
  Console.WriteLine(ex.GetBaseException());
}

5
投票

另一个问题的解决方案是:

XmlRootAttribute xRoot = new XmlRootAttribute();
xRoot.ElementName = "message";
// xRoot.Namespace = "http://www.cpandl.com";
xRoot.IsNullable = true;

XmlSerializer xs = new XmlSerializer(typeof(messageType),xRoot);

也许这是解决您问题的方法。因为我的网络无法使用 MSDN,所以我无法为 XmlRootAttribute 提供更多文档。


0
投票

你从哪里得到“messageType”类?

如果您使用 xsd.exe 为 xml 创建了 xsd,然后使用 xsd 创建了此类。

然后您的项目将有两个包含此类的文件。

  • 其中一个文件是
    designer.cs
    ,其中包含派生自
    DataSet
  • 的此类
  • 一个文件就是一个
    .cs
    文件,它有一个部分类。
  • 当你在反序列化时使用这个类,它会引用 designer.cs 中派生自
    DataSet
    .
  • 的类
  • 但是如果您从项目中删除 designer.cs,您的代码将引用 .cs 文件中的部分类。

通过删除这个 designer.cs 文件,它的类派生自

DataSet
,我能够解决这个错误。


0
投票

我认为您必须为类 messageType 声明 XmlRootAttribute

例如

`[System.Xml.Serialization.XmlRootAttribute(ElementName = "message", IsNulable=false)]

公共课消息类型 { ... }`

© www.soinside.com 2019 - 2024. All rights reserved.