无法在.NET中反序列化XML

时间:2014-10-31 13:52:00

标签: c# xml

这是字符串:

string incomingOrdreXML = @"<GetOrderStatus xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/OrderStatusConsole""><AccountID>5</AccountID><Batch></Batch><Date></Date><OrderNumber></OrderNumber><Password></Password><Sequence></Sequence><StatusCode></StatusCode><Test></Test><TrackingID></TrackingID></GetOrderStatus>";

这是班级:

public class GetOrderStatus
    {
        public string AccountID { get; set; }
        public string Password { get; set; }
        public string Batch { get; set; }
        public string Sequence { get; set; }
        public string Test { get; set; }
        public string Date { get; set; }
        public string OrderNumber { get; set; }
        public string StatusCode { get; set; }
        public string TrackingID { get; set; }
    }

这是反序列化代码:

string incomingOrdreXML = @"<GetOrderStatus xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/OrderStatusConsole""><AccountID>5</AccountID><Batch></Batch><Date></Date><OrderNumber></OrderNumber><Password></Password><Sequence></Sequence><StatusCode></StatusCode><Test></Test><TrackingID></TrackingID></GetOrderStatus>";

            var reader = new StringReader(incomingOrdreXML);
            XmlSerializer serializer = new XmlSerializer(typeof(GetOrderStatus));
            var instance = (GetOrderStatus)serializer.Deserialize(reader);

在最后一行失败,

{"<GetOrderStatus xmlns='http://schemas.datacontract.org/2004/07/OrderStatusConsole'> was not expected."}

此行将根据发送此XML的人员而变化。这意味着如果发件人是OrderStatusConsole,那么如果发件人是杰夫那么它就像上面一样,那么它最终会有杰夫。

任何线索?

提前致谢。

4 个答案:

答案 0 :(得分:0)

如果您没有定义正确的命名空间,则无法反序列化,请删除xmlns='..'行,或使用此行:

[XmlRootAttribute(Namespace = 
    "http://schemas.datacontract.org/2004/07/OrderStatusConsole")]
public class GetOrderStatus
    {

       ...
    }

答案 1 :(得分:0)

我的猜测是你需要忽略这些命名空间。我相信这里已经提到了一个解决方案:

Can I make XmlSerializer ignore the namespace on deserialization?

答案 2 :(得分:0)

您可以尝试像这样实例化XmlSerializer对象:

XmlRootAttribute xRoot = new XmlRootAttribute();
xRoot.ElementName = "GetOrderStatus";
xRoot.Namespace = "http://schemas.datacontract.org/2004/07/OrderStatusConsole";

XmlSerializer serializer = new XmlSerializer(typeof(GetOrderStatus), xRoot);

现在,如果您知道发件人是谁,则可以在实例化序列化程序之前更改命名空间。

答案 3 :(得分:0)

您可以查看xsd工具

xsd myFile.xml /outputdir:myOutputDir
xsd myFile.xsd /outputdir:myOutputDir /classes

这将生成一个xsd或一组类,这些类可以始终将给定的xml片段反序列化。如果您运行几组传入的xml并比较生成的xsds,您应该能够通过添加任何缺少的元素并添加一些minOccurs =“0”或nillable =“true”来提供适用于所有xsds的内容。