1

タイプの何かを返すWebサービスがありますMyData

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

配列のタイプはいくつかのタイプである可能性があるため、私は以前に使用Object[]しました。DataItemsこのメソッドを使用して正常に送信できる2つの異なるクラスがあります。下記参照。

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.

簡単に変更MyFirstClassMySecondClassて独自のプロパティを設定することができ、Webサービスは両方のクラスを適切にシリアル化し、すべてのクラスが満足していました。

ただし、関数によって返される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 };

それでも同じ例外をスローします。何が間違っている可能性がありますか?

Webサービスを介してXMLを適切に渡すにはどうすればよいですか?

4

1 に答える 1

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サービスメソッドの署名を付ける必要がありました。

そしてそれは完璧に機能していました!

于 2011-06-09T11:40:21.923 に答える