不規則な構造のXMLデータを取得する場合。DataSetを自然に適合させるのではなく、オブジェクトモデルがデータを簡単に操作できるようにする必要があります。XMLスキーマ定義ツール(Xsd.exe)を/ classesオプションとともに使用して、XMLファイルからC#またはVB.Netクラスを生成できます。
XSD.exeは次の場所にあります:
C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\xsd.exe
C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\xsd.exe
VisualStudioコマンドラインからxsd.exeを実行します。
-スタート-すべてのプログラム
-VisualStudio-
ツール
-
コマンドライン
これは、すべてのXSDコマンドラインパラメーターを表示するコマンドです。
xsd /?
不規則なXMLファイル(XmlResponseObject.xml)をクラスに変換するには:
xsd c:\Temp\XmlResponseObject.xml /classes /language:CS /out:c:\Temp\
これにより、XMLを表すクラスを含むcsharpファイルが生成されます。名前空間によって明確にされる単一ファイル内の重複クラスに注意して、それを別々のクラスファイルに再生成することをお勧めします。いずれにせよ、クラスはすべてのxml属性で見栄えが良くなることはありませんが、良い部分はXMLを介してそれらにバインドできることです。これは、REST Webサービスを介してXMLを取得する例です。xmlResponseObjectは、XMLに適合するクラスのObjectModelです。
public interface IYourWebService
{
XmlResponseObject GetData(int dataId);
}
public class YourWebService : IYourWebService
{
public XmlResponseObject GetData(int dataId)
{
XmlResponseObject xmlResponseObject = null;
var url = "http://SomeSite.com/Service/GetData/" + dataId;
try
{
var request = WebRequest.Create(url) as HttpWebRequest;
if (request != null)
{
request.AllowAutoRedirect = true;
request.KeepAlive = true;
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322; InfoPath.2; .NET4.0C; .NET4.0E)";
request.Credentials = CredentialCache.DefaultNetworkCredentials;
request.CookieContainer = new CookieContainer();
var response = request.GetResponse() as HttpWebResponse;
if (request.HaveResponse && response != null)
{
var streamReader = new StreamReader(response.GetResponseStream());
var xmlSerializer = new XmlSerializer(typeof(XmlResponseObject));
xmlResponseObject = (XmlResponseObject)xmlSerializer.Deserialize(streamReader);
}
}
}
catch (Exception ex)
{
string debugInfo = "\nURL: " + url;
Console.Write(ex.Message + " " + debugInfo + " " + ex.StackTrace);
}
return xmlResponseObject;
}
}
ドキュメントの変更のみを送受信したい場合は、IsDirtyフラグを使用してクラスを変更できます。作業するクラスができたら、diffを簡単に検出できると確信しています。