2014-10-31 74 views
0

此反序列化XML是字符串:故障在.NET

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,那么如果发件人是Jeff,那么它就像上面那样,那么它最终会有Jeff。

任何线索?

在此先感谢。

回答

0

如果你没有正确的命名空间中定义,或者删除xmlns='..'线,或使用它不能反序列化:

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

     ... 
    } 
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); 

现在,如果你知道发件人是谁,你可以更改命名空间在实例化串行器之前。

0

你可以看看在xsd工具

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

,这将产生一个XSD或一组XML的一段给定总是可以反序列化为类。如果您运行多组传入xml并比较生成的xsds,则应该能够通过添加任何缺失的元素并在某些minOccurs =“0”或nillable =“true 。