[ASP.NET]使用Xml建立Web Service回傳用的Class物件

Web Service可以回傳的型態多樣,最近工作上遇到了要求須使用物件進行回傳,在Class產出及Class細部設定部分用了很久,因此有了以下筆記。

【開發環境】
開發工具:Visual Studio Professional 2015
.Net Framework:4.6.1

本次主要是遇到必須與對方進行XML電文交換,下方是範例電文,原本以為就回傳XmlDocument就好了,但這一切都是我的天真,對方期望的是回傳物件....

<?xml version="1.0" encoding="UTF-8"?>
<myprefix1:Parent xmlns:myprefix1="http://myurl.com.tw/">
   <myprefix1:Header>
      <myprefix1:From>FromAddress</myprefix1:From>
      <myprefix1:To>ToAddress</myprefix1:To>
   </myprefix1:Header>
   <myprefix1:Body>
      <myprefix1:Status>Success</myprefix1:Status>
   </myprefix1:Body>
</myprefix1:Parent>

上面其實可以看到這個電文有Namespace也有Prefix,然後我們要用物件接收對方傳進來的這麼xml,也必須用物件傳回去。

【問題一】要如何從Xml檔產生.cs檔呢?

這時候可以使用xsd.exe,他的位置會在以下路徑底下。
C:\Program Files (x86)\Microsoft SDKs\Windows\
詳細路徑可能會依照每個人電腦安裝的Framework版本不同而不一樣,像是我電腦xsd.exe的位置在....
C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools

首先,在上方位置列的地方輸入cmd並按下Enter。

這樣就會開啟命令提示字元(cmd.exe),而且也幫你切換到這個目錄下了,非常的方便呢!

接下來輸入『xsd 你要轉的檔案 /outputdir:你想放的位置』,像是下方的範例。

xsd D:\TEST\SampleXml.xml /outputdir:D:\TEST

按下Enter後會產生.xsd檔。

再來輸入『xsd 你要轉的xsd檔案 /classes /outputdir:你想放的位置』把xsd轉成.cs檔,如下。

xsd D:\TEST\SampleXml.xsd /classes /outputdir:D:\TEST

這樣就大功告成可以產生.cs檔了。

【問題二】物件回傳Namespace Prefix不見了!?

這是後要對產出來的物件進行處理,打開產出的.cs檔在最外層標籤的class內加上以下代碼。

[XmlNamespaceDeclarations]
public XmlSerializerNamespaces xmlns
{
	get
	{
		XmlSerializerNamespaces xsn = new XmlSerializerNamespaces();
		xsn.Add("myprefix1", "http://myurl.com.tw/");
		return xsn;
	}
	set { /* needed for xml serialization */ }
}

結果會如下圖所示。

這樣return物件的時候就也會有Namespace Prefix了!

參考資料:
XML Schema Definition Tool (Xsd.exe)
Web 服務描述語言工具 (Wsdl.exe)
Remove namespace from ASP.NET web service, or add namespace prefix?