Передача Xml из веб-службы - PullRequest
1 голос
/ 09 июня 2011

У меня есть веб-сервис, который возвращает что-то типа MyData.

 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.

Я мог бы легко изменить MyFirstClass на MySecondClass и установить его собственные свойства, и веб-сервис будет правильно сериализовать обаклассы и все были довольны!

Однако теперь мне нужно передать XML, возвращенный функцией DataSet.GetXml().

Естественно, то, что я сделал, было

 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 };

Тем не менее это бросает то же самое исключение.Что может быть не так?

Как правильно передать XML через веб-сервис?

1 Ответ

0 голосов
/ 09 июня 2011

Ответ был довольно прост. Все, что мне нужно было сделать, это создать родительский класс, от которого другие классы собирались наследовать.

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)) в подпись метода веб-службы.

И он работал отлично!

...