2011-06-09 55 views
1

我有一个Web服务,它返回类型为MyData的东西。从Web服务中传递Xml

public class MyData 
{ 
     public string Name; 
     [XmlElement("item")] 
     public Object[] DataItems; 
} 

我已经使用Object[]DataItems因为数组的类型可以是几种类型的。我有两个不同的类,我可以使用这种方法成功发送。见下文。

clientResults是填充的DataSet。

MyData returnResult = new MyData(); 

MyFirstClass[] resultData = new MyFirstClass[clientResults.Tables[0].Rows.Count]; 

resultData.MyFirstClassProperty1 = "Blah Blah"; 
resultData.MyFirstClassProperty2 = "Blah Blah"; 

returnResult.DataItems = resultData. 

我可以很容易地改变MyFirstClassMySecondClass并设置自己的属性和Web服务将正常序列两个类,每一个是幸福的!

但是现在需要传递由DataSet.GetXml()函数返回的XML。

当然,我所做的就是

XmlDocument xdoc = new XmlDocument(); 
xdoc.LoadXml(clientResults.GetXml()); 
resultData.DataItems = new XmlDocument[] { xdoc }; 

但这抛出异常

System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type System.Xml.XmlDocument may not be used in this context. 

所以我就想,好吧,您有XmlNode的尝试。

XmlDocument xdoc = new XmlDocument(); 
xdoc.LoadXml(clientResults.GetXml()); 
XmlNode xElement = xdoc.SelectSingleNode("/"); 
result.DataItems = new XmlNode[] { xElement }; 

还是抛出了SAME异常。什么可能是错的?

如何正确地通过Web服务传递XML?

+0

你检查了什么会抛出异常? xdoc.LoadXml or clientResults.GetXml() – 2011-06-09 08:58:38

+0

没有一个。它引发异常的XML序列化。如果重要,我可以粘贴堆栈跟踪。 – 2011-06-09 09:00:42

+0

也许以下两个像可以帮助:http://stackoverflow.com/questions/935080/serializing-generic-xml-data-across-wcf-web-service-requests http://social.msdn.microsoft.com /论坛/ en-US/asmxandxml /线程/ 6ff9c882-f353-4ad5-816a-7fa9f424bc6c/ – 2011-06-09 09:26:58

回答

0

答案很简单。我所要做的就是创建一个其他类将要继承的父类。

public class BaseData 
{ 

} 

public class XmlData : BaseData 
{ 
    public XmlNode xml; 
} 

而且我做了Object[]BaseData[]

public class MyData 
{ 
     public string Name; 
     [XmlElement("item")] 
     public BaseData[] DataItems; 
} 

然后我选择使用XPath的节点并分配它。

XmlDocument xdoc = new XmlDocument(); 
xdoc.LoadXml(clientResults.GetXml()); 
XmlNode xElement = xdoc.SelectSingleNode("/"); 

XmlData[] xmlData = new XmlData[1]; 
xmlData[0] = new XmlData(); 
xmlData[0].xml = xElement; 

result.DataItems = xmlData; 

我还必须将XmlInclude(typeof(XmlData))添加到Web服务方法签名中。

它完美的工作!

+0

我试过你的源码,我必须缺少一些东西......我从块2的属性上得到以下错误:'系统。 Xml.XmlElement'不是一个属性类 - 任何想法? – Hardryv 2011-09-06 17:40:38

+0

我想你应该有一个使用System.Xml.Serialization.XmlElementAttribute。看看这个[MSDN文章](http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlelementattribute.aspx) – 2011-09-07 02:35:08