这是字符串:
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,那么如果发件人是杰夫那么它就像上面一样,那么它最终会有杰夫。
任何线索?
提前致谢。
答案 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的内容。