【发布时间】:2017-01-27 04:24:18
【问题描述】:
我有很多结构相同的 XML 文件。他们中的许多人工作正常,但是对于某些 XmlSerializer 给了我一个错误,但是当我将文档放入 xml 验证器时 - 它说文档是正确的。
反序列化代码:
var document = serializer.Deserialize(File.OpenRead(file));
错误:
System.InvalidOperationException: There is an error in XML document (504, 8). ---> System.Xml.XmlException: Unexpected node type Element. ReadElementString method can only be called on elements with simple or empty content. Line 504, position 8.
at System.Xml.XmlReader.ReadElementString()
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderPatentdocument.Read33_Claimtext(Boolean isNullable, Boolean checkType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderPatentdocument.Read34_Claim(Boolean isNullable, Boolean checkType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderPatentdocument.Read35_Claims(Boolean isNullable, Boolean checkType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderPatentdocument.Read43_Patentdocument(Boolean isNullable, Boolean checkType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderPatentdocument.Read44_patentdocument()
--- End of inner exception stack trace ---
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
at System.Xml.Serialization.XmlSerializer.Deserialize(Stream stream)
给出错误的文档部分:
<text>12. Führungsschiene nach einem der Ansprüche 2 bis 11, dadurch gekennzeichnet, daß in den beiden Nutwänden (<b>11<i>a</i>, 11</b><i>a′)</i> einander gegenüberliegende Bohrungen (<b>14</b><i>a</i>, <b>14</b><i>a</i>′) vorgesehen sind, von denen die eine Bohrung (<b>14</b><i>a</i>′) durch das Einsatzteil (<b>15</b><i>a)</i> verschlossen ist.</text>
我想这是因为里面的内联html标签,因为它在i标签的位置抱怨这条线
<b>11<i>a</i>, 11</b>
但是例如根据 XmlSerializer 这个 xml 是正确的,并且可以反序列化它:
<text>9. Führungsschiene nach Anspruch 8, dadurch gekennzeichnet, daß der Ansatz (<b>20</b>) die Zuführfläche (<b>25</b>) aufweist.</text>
所以我的问题是为什么 xml 验证器说文档是有效的,而 XmlSerializer 不能反序列化它?是否可以在不更改文档的情况下找到解决方法?
【问题讨论】:
-
您的应用程序中需要一组与 xml 文件匹配的类。序列化/反序列化不是自动的。
-
文档不是有效的 XML。它包含名为
b和i的未知XML 标记。如果要将 HTML 字符串包含在 XML 文档中,则必须对其进行 编码 -
@CharlesMager 检查错误消息 - 反序列化器抱怨一个简单的元素。调用堆栈显示反序列化程序是从 XSD 生成的,该 XSD 需要
<text>元素中的文本。 XSD 错误,或者序列化程序中存在错误。如果数据来自第三方,则 OP 可能必须找到处理无效数据的方法 -
@syned 验证器没有提到 XSD,只有旧的 DTD。您只是复制了文件还是包含了指向有效 DTD 的链接?如果你只是复制文件,结果是没有意义的。问题是您用来生成反序列化器的 XSD 需要 简单文本内容 用于
<text>。您是否根据一些示例生成了 XSD? -
不要混淆 valid 和 well-formed xml!您的 xml 格式正确,因此 XmlSerializer 通常可以反序列化。但是根据类的定义,您的 XML 无效。显然,您应该将
b和i添加到您的类属性中。
标签: c# .net xml xml-deserialization