请帮忙。我在从服务器反序列化数据时出错了,
命名空间中的顶级XML元素“Name”引用了不同的类型 Object1.LocalStrings和System.String。使用XML属性指定 另一个或多个元素的XML名称或命名空间。
我有一个ObjectType类,其中包含属性Name和List<SupportedIp>
。 SupportedIp类也包含属性Name。请参考下面的代码:
[XmlRootAttribute("SupportedIp", Namespace = "http://test.com/2010/test", IsNullable = false)]
public partial class SupportedIp
{[XmlElementAttribute(Namespace = "")]
public string Name
{
get;
set;
} .... }
[GeneratedCodeAttribute("xsd", "2.0.50727.1432")]
[SerializableAttribute()]
[DebuggerStepThroughAttribute()]
[DesignerCategoryAttribute("code")]
[XmlTypeAttribute(Namespace = "http://test.com/2010/test")]
[XmlRootAttribute("ObjectType", Namespace = "http://test.com/2010/test", IsNullable = false)]
public partial class ObjectType
{
/// <remarks/>
[XmlElementAttribute(ElementName = "", Namespace = "")]
public LocalStrings Name
{
get;
set;
}
/// <remarks/>
[XmlArrayAttribute(ElementName = "Supportedip", Namespace = "")]
[XmlArrayItemAttribute(IsNullable = false, Namespace = "")]
public List<Supportedip> Supportedip
{
get;
set;
}
}
当应用程序到达 XmlSerializer 部分时,会显示错误。我看过一些相关的帖子,但没有一个具体的答案。
答案 0 :(得分:11)
根据您的编写,我认为问题在于您具有相同的元素名称(namespace="", name="Name")
,其中包含两种不同类型的内容(字符串类型和localstrings类型),这在xml中是非法的。这意味着每个xml解析器都应该引发您打印的致命错误。解决方案是更改元素的名称或使用相同的名称,但将它们与不同的名称空间相关联。例如,而不是:
[XmlElementAttribute(Namespace = "")]
你可以把:
[XmlElementAttribute(Namespace = "http://test.com/2010/test")]
核心问题似乎是XMLSerializer使用XSD架构验证。这意味着您定义的每个XmlElementAttribute都附加了一个类型(从here阅读更多内容)。其中一个XSD约束是“元素声明一致”约束,这意味着具有相同名称(和命名空间)的任何两个元素必须具有相同的类型(从here中读取更多内容)。
希望它有所帮助。
答案 1 :(得分:0)
您在方法标头中声明的参数必须对命名空间中的所有Web方法都是唯一的。因为参数是soap:body的顶级xml标记。祝你好运。
答案 2 :(得分:0)
阅读错误: 使用 XML 属性为元素指定另一个 XML 名称或命名空间
示例:
[XmlElement("Animal", typeof(Dog), Namespace = "...Dog")]
[XmlElement("Animal", typeof(Cat), Namespace = "...Cat")]
public Animal Animal;