前幾天用WebService寫了傳數據的接口。
要求是 傳XML數據 並用Schema(即xsd文件)驗證 並且伴有圖片傳輸。
做這個項目首先要理解
WebService 傳數據本身是通過XML格式傳的,所傳的數據最后都被包裝在一個XML里了
基於這點,需要准備以下幾個知識點。
1. XML Schema 的編寫 (命名空間 ,數據類型,定義屬性類型,定義多個相同標簽方法)
2.用Xsd驗證XML的程序代碼
3.將文件以什么形式放到xml里
4.如何從xml里取出文件並保存到本地
ps:我用正則聲稱XML的時候用\1做后向引用不成功,原因是。C#根js一樣都用的是類似$1這樣引用的,坑爹的教程啊。
好了。我們把幾個知識點羅列一下就OK啦。
1.列出XML於XML Schema的樣本
a.xml
<?xml version="1.0" encoding="utf-8" ?>
<!---->
<myxml xmlns="http://www.aaa.com">
<!---->
<Type>01</Type>
<!--varchar(50), 附件類型
-->
<Name></Name>
<!--varchar(200),附件名稱
-->
<Time></eaTime>
<!--varchar(50),時間
-->
<file fileName=""></file>
<file fileName=""></file>
<!--varbinary 上傳文件
-->
</myxml >
a.xsd
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="EmrAcce"
targetNamespace="http://www.cnstroke.com"
elementFormDefault="qualified"
xmlns="http://www.cnstroke.com"
xmlns:mstns="http://www.cnstroke.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xs:element name="myxml ">
<xs:complexType>
<xs:sequence>
<xs:element name="Type" type="TypeT"/>
<xs:element name="Name" type="xs:string"/>
<xs:element name="Time" type="xs:dateTime"/>
<xs:element name="file" maxOccurs="unbounded" >
<xs:complexType>
<xs:attribute name="fileName" type="xs:string"></xs:attribute>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="TypeT">
<xs:restriction base="xs:string">
<xs:pattern value="01|02|03|09|10|11|99"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ClassT">
<xs:restriction base="xs:string">
<xs:pattern value="01|02|03|04|99"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="fileNameT">
<xs:restriction base="xs:string">
<xs:pattern value=".+[\.]{1,1}.+"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
2..用Xsd驗證XML的程序代碼
private void ValidationEventCallBack(Object sender, ValidationEventArgs e)
{
if (e.Severity == XmlSeverityType.Warning)//區分是警告還是錯誤
{
xmlErr += "<br/>驗證成功!警告:" + e.Message;
}
else
{
xmlErr += "<br/>Err:" + e.Message;
}
}
private void CheckXmlValidate(string strRequestXML)
{
string ErrString = string.Empty;
StringReader sRead = null;
XmlReader xmlRead = null;
XmlSchemaSet schemaSet;
try
{
schemaSet = new XmlSchemaSet();
sRead = new StringReader(strRequestXML);
schemaSet.Add(null, AppDomain.CurrentDomain.BaseDirectory + "/XML/" + xsdFile + ".xsd");
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationEventHandler += new ValidationEventHandler(this.ValidationEventCallBack);
settings.ValidationType = ValidationType.Schema;
settings.Schemas = schemaSet;
xmlRead = XmlReader.Create(sRead, settings);
// xmlRead = XmlReader.Create(xmlUrl, settings);//此處是通過傳路徑獲取xml
while (xmlRead.Read())
{
}
if (ErrString.ToString() == String.Empty)
{
xmlErr += "驗證成功!";
}
else
{
xmlErr += "驗證失敗!原因可能是:" + ErrString;
}
}
catch (XmlException exec)
{
xmlErr += exec.Message;
}
finally
{
if (xmlRead != null)
{
xmlRead.Close();
}
}
}
3.將文件以什么形式放到xml里
/// <param name="filePath">相對路徑</param>
/// <param name="fileName"></param>
protected void setXmlNodeFile(XmlDocument xmldoc, XmlElement xmlelem, string filePath,string fileName)
{
XmlElement file = xmldoc.CreateElement("", "file", "");
file.SetAttribute("fileName",fileName);
string data = null;
int readByte = 0; //
int bytesToRead = 900000;
FileStream fs = new FileStream(Server.MapPath(filePath), FileMode.Open);
bytesToRead = (int)fs.Length;
BinaryReader br = new BinaryReader(fs);
byte[] base64buffer = new byte[bytesToRead];
do
{
readByte = br.Read(base64buffer, 0, bytesToRead); //將數據讀入字節數組
// xmlTxtWt.WriteBase64(base64buffer, 0, readByte); //將數組中二進制值編碼為Base64並寫出到XML文件
} while (bytesToRead <= readByte);
MemoryStream mem = new MemoryStream(base64buffer);
data = Convert.ToBase64String(mem.ToArray());
file.InnerText = data;
xmlelem.AppendChild(file);
}
4.如何從xml里取出文件並保存到本地
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(Server.MapPath("~/XML/ceshi1.xml"));
string PicByte = xmldoc.GetElementsByTagName("file")[0].InnerText;
byte[] b = Convert.FromBase64String(PicByte);
// System.IO.MemoryStream sm = new MemoryStream();
// sm.Write(b, 0, b.Length);
using( FileStream fs = new FileStream(Server.MapPath("~/XML/yts.jpg"), FileMode.Create))
{
fs.Write(b,0,b.Length);
}
return Content("ok");
這樣就好了其他細節 就不用說了
-----------------------------------------以下內容摘自網絡
1.通過byte傳輸
把文件轉換
public static byte[] ConvertToBinary(string Path)
{
FileStream stream = new FileInfo(Path).OpenRead();
byte[] buffer = new byte[stream.Length];
Console.WriteLine("The lenght of the file is "+buffer.Length);
stream.Read(buffer, 0, Convert.ToInt32(stream.Length));
return buffer;
}
static byte[] buffer;
buffer = ConvertToBinary(path);
webService
FileStream fstream = new FileStream(filePath + fileName, FileMode.Append);
try
{
//MemoryStream m = new MemoryStream(fileBt);
//m.WriteTo(fstream);
fstream.Write(fileBt, 0, fileBt.Length); //二進制轉換成文件
fstream.Close();
//rst += "\r\n";
rst += "File Name is:" + fstream.Name + "\r\n";
rst += "File Lenght is:" + fstream.Length + "\r\n";
rst += "File Position is:" + fstream.Position + "\r\n";
}
catch (Exception ex)
{
//拋出異常信息
rst = ex.ToString();
}
finally
{
fstream.Close();
}