【问题标题】:deserialize the XML Document --- Need Help反序列化 XML 文档 --- 需要帮助
【发布时间】:2010-12-15 20:48:03
【问题描述】:

我现在正在使用下面的代码 sn-p 来反序列化 XML 文档...

[WebMethod]
public XmlDocument OrderDocument(XmlDocument xmlDoc)
{
   XmlSerializer serializer = new XmlSerializer(typeof(sendOrder.Order));

   string xmlString = xmlDoc.OuterXml.ToString();

   byte[] buffer = ASCIIEncoding.UTF8.GetBytes(xmlString);

   MemoryStream ms = new MemoryStream(buffer);

   sendOrder.Order orderDoc = (sendOrder.Order)serializer.Deserialize(ms);

   sendOrder.WebService_ConsureWebService ws = 
         new sendOrder.WebService_ConsureWebService();

   ws.Operation_1(ref orderDoc);

   return xmlDoc;
}

谁能告诉我代码有什么问题,因为错误表明 XML 文档中存在错误,但是如果您检查我正在传递的文档,甚至 Order 对象也具有相同的结构和命名空间

XML 文档中存在错误(1, 2)。 ---> System.InvalidOperationException: http://ConsureWebService.Order'> 没想到。

【问题讨论】:

  • 请在编辑器中突出显示您的代码部分,然后单击编辑器工具栏上的“代码”按钮 (101 010),或按键盘上的 Ctrl-K 格式化为代码(和获取语​​法高亮和所有)
  • 如果在GetBytes()中设置断点,那么xmlString的值是多少?
  • 你不能只使用Order 作为你的网络方法的参数吗?
  • 已更新以反映您添加的 cmets(示例);现在可以工作了。
  • 如果你不能更新源(包括[XmlRoot]),我可以告诉你如何自定义XmlSerializer;如果有帮助,请添加评论(对我的回复)。

标签: c# xml-serialization serialization web-services


【解决方案1】:

我猜这是一个命名空间问题(即 xml 命名空间)。你能展示示例 xml 和 Order 类吗?

有关信息,您可以通过以下方式从XmlDocument“按原样”阅读:

sendOrder.Order orderDoc;
using(XmlReader reader = new XmlNodeReader(xmlDoc.DocumentElement)) {
    orderDoc = (sendOrder.Order) serializer.Deserialize(reader);
}

比搞乱编码和流要简单得多...


使用您的示例 xml/代码,您可以通过添加以下内容来解决此问题:

[XmlRoot(Namespace = "ConsureWebService.Order")]

上课。如果该类将自己宣传为partial class,您甚至可以在单独的代码文件中执行此操作,因此您无需编辑生成的代码。这将是(在正确的命名空间中):

[XmlRoot(Namespace = "ConsureWebService.Order")]   
public partial class Order { }

【讨论】:

  • 我传递的 XML 文档如下 ConsureWebService.Order"> OrderId_0OrderName_0:订单>
  • 另外,这是我试图反序列化到的 sendOrder.Order 对象: namespace sendOrder { [Serializable] [XmlType(AnonymousType = true, Namespace = "ConsureWebService.Order")] [GeneratedCode("System.Xml ", "2.0.50727.3053")] [DebuggerStepThrough] [DesignerCategory("code")] public class Order { public Order(); public string OrderId { get; set; } public string OrderName { get; set; } } }
  • XmlSerializer deserializer = new XmlSerializer(typeof(sendOrder.Order)); sendOrder.Order orderDoc;使用 (XmlReader reader = new XmlNodeReader(xmlDoc.DocumentElement)) { orderDoc = (sendOrder.Order)deserializer.Deserialize(reader); } 使用上面的代码sn-p,在调试时我得到了你的读者的空值,我可以找到xmlDoc的xml文档
  • 订单文件元数据文件,我正在尝试使用暴露的 BTS 网络服务....................... ..................................................... ..................................................... ..... namespace sendOrder { [Serializable] [XmlType(AnonymousType = true, Namespace = "ConsureWebService.Order")] [GeneratedCode("System.Xml", "2.0.50727.3053")] [DebuggerStepThrough] [DesignerCategory("code") ] public class Order { public Order(); public string OrderId { get; set; } public string OrderName { get; set; } }
【解决方案2】:
<ns0:Order xmlns:ns0="ConsureWebService.Order">; 
      <OrderId>OrderId_0</OrderId> 
      <OrderName>OrderName_0</OrderName> 
 </ns0:Order> 

这似乎不是一个完全有效的 xml 文档,您可以发布整个内容吗?这有点像只给某人堆栈跟踪的第一行并说“好吧!” .

编辑

这是一个猜测:http://support.microsoft.com/kb/816225

你有默认构造函数吗?

【讨论】:

  • 不,这是我传递并尝试反序列化到 sendOrder.Order 对象的完整 XML 文档......我之前都已作为评论发布
  • 如果你注意到文档的命名空间和结构是相同的......我不知道为什么会出现以下错误...... System.Web.Services.Protocols.SoapException: Server was无法处理请求。 ---> System.InvalidOperationException: XML 文档 (1, 2) 中存在错误。 ---> System.InvalidOperationException: 不是预期的。
  • 我正在尝试反序列化具有默认构造命名空间 sendOrder { [Serializable] [XmlType(AnonymousType = true, Namespace = "ConsureWebService.Order")] [GeneratedCode("System. Xml", "2.0.50727.3053")] [DebuggerStepThrough] [DesignerCategory("code")] public class Order { public Order();公共字符串 OrderId { 获取;放; } 公共字符串 OrderName { 获取;放; } } }
猜你喜欢
  • 2021-02-13
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多