WebサービスからXmlを渡す

c# invalidoperationexception web-services xml xmldocument
WebサービスからXmlを渡す

`MyData`型の何かを返すWebサービスがあります。

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

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

`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`に簡単に変更し、独自のプロパティを設定すると、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を適切に渡すにはどうすればよいですか?

  1  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))」を追加する必要がありました。

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

0


タイトルとURLをコピーしました