【问题标题】:Passing an Xml from a Web Service从 Web 服务传递 Xml
【发布时间】:2011-09-11 12:35:04
【问题描述】:

我有一个返回 MyData 类型的 Web 服务。

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

我将Object[] 用于DataItems,因为数组的类型可以有多种类型。我有两个不同的类,我可以使用这种方法成功发送它们。见下文。

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?

【问题讨论】:

标签: c# xml web-services xmldocument invalidoperationexception


【解决方案1】:

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

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))

而且效果很好!

【讨论】:

  • 我尝试了您的来源,但我一定遗漏了一些东西......我在块 2 的属性上收到以下错误:'System.Xml.XmlElement' 不是属性类 - 有什么想法吗?
  • 你应该有一个 using System.Xml.Serialization.XmlElementAttribute 我猜。看看这个MSDN article
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 2016-01-21
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
相关资源
最近更新 更多