从Web服务传递Xml

本文关键字:Xml 服务 Web | 更新日期: 2023-09-27 17:58:40

我有一个web服务,它返回MyData类型的东西。

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

对于DataItems,我使用了Object[],因为数组的类型可以是多种类型。我有两个不同的类,可以使用此方法成功发送。请参见下文。

clientResults是已填充的数据集。

MyData returnResult = new MyData();
MyFirstClass[] resultData = new MyFirstClass[clientResults.Tables[0].Rows.Count];
resultData.MyFirstClassProperty1 = "Blah Blah";
resultData.MyFirstClassProperty2 = "Blah Blah";
returnResult.DataItems = resultData.

我可以很容易地将MyFirstClass更改为MySecondClass,并设置自己的属性,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 };

它仍然抛出了相同的异常。可能出了什么问题?

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

从Web服务传递Xml

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

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;

我还必须为web服务方法签名添加XmlInclude(typeof(XmlData))

它工作得很完美!