Ví dụ đọc 1 tài liệu Xml

Một phần của tài liệu tìm hiểu các dịch vụ WEB cho ứng dụng GIS và xây dựng ứng dụng minh họa khai thác dịch vụ (Trang 126)

™ Xét chuỗi sRequestXml có nội dung như sau: <?xml version="1.0" ?> <wfs:Transaction version="1.0.0" service="WFS" xmlns:cite="http://www.opengeospatial.net/cite" xmlns:ogc="http://www.opengis.net/ogc"

Chương 6. Cài đặt chương trình OpenGISServer xmlns:wfs="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema- instance" xsi:schemaLocation="http://www.opengis.net/wfs ../wfs/1.0.0/WFS-transaction.xsd"> <wfs:Update typeName="duong"> <wfs:Property> <wfs:Name>NAME</wfs:Name> <wfs:Value>Ngô Gia Tự</wfs:Value> </wfs:Property> <ogc:Filter> <ogc:FeatureId fid="duong.3"/> </ogc:Filter> </wfs:Update> <wfs:Delete typeName=”quan”> <ogc:Filter> <ogc:FeatureId fid="quan.1"/> </ogc:Filter> </wfs:Delete> </wfs:Transaction>

™ Mỗi XmlNode sẽ tương ứng với 1 tag trong chuỗi Xml, chẳng hạn tag <wfs:Transaction> là 1 XmlNode.

™ Mỗi XmlNode có chứa nhiều XmlNode con, và có thể chứa các Attributes

của node đó.

Chẳng hạn, trong ví dụ trên thì node <wfs:Transaction> có 2 node con là <wfs:Update> và <wfs:Delete>. Node <wfs:Update> này chứa 2 node con là <wfs:Property> và <ogc:Filter>.

Chương 6. Cài đặt chương trình OpenGISServer

™ Đọc dữ liệu từ chuỗi Xml này.

ƒ Trước hết, cần phải tạo 1 XmlDocument tương ứng với chuỗi này: XmlDocument requestDocument = new XmlDocument();

requestDocument.LoadXml(sRequestXml); ƒ Lấy node đầu tiên <wfs:Transaction>:

XmlNode first = requestDocument.FirstNode; ƒ Lấy 2 node con <wfs:Update> và <wfs:Delete>: XmlNodeList childs = first.ChildNodes; XmlNode updateNode = childs[0];

XmlNode deleteNode = childs[1];

ƒ Lấy attribute “typeName” của node <wfs:Update>

string sUpdateTypeName = updateNode.Attributes[“typeName”]; ƒ Nếu như node không chứa attribute này thì hàm này trả về null.

ƒ Lấy giá trị của Node <wfs:Name>, sử dụng thuộc tính InnerXml của lớp XmlNode

string Name = updateNode.FirstChild.FirstChild.InnerXml;

ƒ Lấy tên của Node <wfs:Update>, có cả phần NameSpace phía trước tên node

string sNodeName = updateNode.Name;

Khi đó sNodeName = “wfs:Update”, trong đó “wfs” là NameSpace của Update”.

ƒ Lấy tên của Node <wfs:Update>, không lấy phần NameSpace phía trước tên node

string sLocalNodeName = updateNode.LocalName;

Chương 6. Cài đặt chương trình OpenGISServer

ƒ Để lấy chuỗi Xml tương ứng với Node <wfs:Update>: string xmlUpdate = updateNode.OuterXml;

Khi đó, chuỗi xmlUpdate sẽ có giá trị là: <wfs:Update typeName="duong"> <wfs:Property>

<wfs:Name>NAME</wfs:Name> <wfs:Value>Ngô Gia Tự</wfs:Value> </wfs:Property> <ogc:Filter> <ogc:FeatureId fid="duong.3"/> </ogc:Filter> </wfs:Update> 6.5. Các lớp trong chương trình Tên lớp Mô tả

Others/ExceptionBuilder Xây dựng chuỗi XML dùng để báo

các lỗi về cho client khi có lỗi trong request

Other/OtherTasks Chứa tên các FeatureType trong

chương trình Chức các thuộc tính của các FeatureType Chứa các hàm thực hiện những tác vụ phụ trong chương trình WFS/CheckBasicParameterClasses/Abstra ctHTTPClass Lớp trừu tượng, có tác dụng lấy các tham số mà client gửi lên trong request.

Chương 6. Cài đặt chương trình OpenGISServer WFS/CheckBasicParameterClasses/HTTP GetClass Kế thừa từ lớp CheckBasicParameterClasses/Abstrac tHTTPClass, có tác dụng lấy các tham số mà client gửi lên trong 1 HTTP GET request WFS/CheckBasicParameterClasses/HTTP PostClass Kế thừa từ lớp CheckBasicParameterClasses/Abstrac tHTTPClass, có tác dụng lấy các tham số mà client gửi lên trong 1 HTTP POST request

WFS/FeatureClass/AbstractFeature Là 1 lớp abstract, gồm các hàm dùng (adsbygoogle = window.adsbygoogle || []).push({});

để thực hiện các tác vụ liên quan đến

các FeatureType trên Server, chẳng

hạn như:

Đọc từ cơ sở dữ liệu để lấy về các Feature thỏa 1 sốđiều kiện nào đó Tạo ra chuỗi Xml mô tả các Feature để trả về cho client (chức năng này được cài đặt cụ thểở các lớp con của nó).

Lấy các thuộc tính của Feature ……

Chương 6. Cài đặt chương trình OpenGISServer

WFS/FeatureClass/DistrictFeature Kế thừa từ lớp

WFS/FeatureClass/AbstractFeature. Có chức năng thực hiện các thao tác trên loại Feature “Quan”:

Lấy các thuộc tính của loại Feature “Quan”.

Tạo chuỗi Xml mô tả với các Feature “Quan” lấy được từ cơ sở dữ liệu để trả về cho client

WFS/FeatureClass/PlaceFeature Kế thừa từ lớp

WFS/FeatureClass/AbstractFeature. Có chức năng thực hiện các thao tác trên các Feature thuộc loại Feature “nơi chốn”

Lấy các thuộc tính của loại Feature “noi chon”.

Tạo chuỗi Xml mô tả với các Feature “noi chon” lấy được từ cơ sở dữ liệu để trả về cho client

WFS/FeatureClass/RiverFeature Kế thừa từ lớp

WFS/FeatureClass/AbstractFeature. Có chức năng thực hiện các thao tác trên các Feature thuộc loại Feature “Song”

Lấy các thuộc tính của loại Feature “Song”.

Tạo chuỗi Xml mô tả với các Feature “Song” lấy từ csdl trả về cho client.

Chương 6. Cài đặt chương trình OpenGISServer

WFS/FeatureClass/RoadFeature Kế thừa từ lớp

WFS/FeatureClass/AbstractFeature. Có chức năng thực hiện các thao tác trên các Feature thuộc loại Feature “Duong”

Lấy các thuộc tính của loại Feature “Duong”.

Tạo chuỗi Xml mô tả với các Feature “Duong” lấy được từ cơ sở dữ liệu để trả về cho client WFS/FeatureClass/UniversityEnrollmentF eature Kế thừa từ lớp WFS/FeatureClass/AbstractFeature. Có chức năng thực hiện các thao tác trên các Feature thuộc loại Feature “UBNDQuan”

Lấy các thuộc tính của loại Feature “UBNDQuan”.

Tạo chuỗi Xml mô tả với các Feature “UBNDQuan” lấy được từ cơ sở dữ liệu để trả về cho client

WFS/FeatureClass/YPageSitFeature Kế thừa từ lớp

WFS/FeatureClass/AbstractFeature. Có chức năng thực hiện các thao tác trên các Feature thuộc loại Feature “YPageSit”

Lấy các thuộc tính của loại Feature “YPageSit”.

Tạo chuỗi Xml mô tả với các Feature “YPageSit” lấy từ csdl trả về client.

Chương 6. Cài đặt chương trình OpenGISServer (adsbygoogle = window.adsbygoogle || []).push({});

WFS/FilterClasses/FilterSolution Có chức năng tạo ra chuỗi query dùng

để truy vấn cơ sở dữ liệu từđối tượng XmlDocument mô tả chuỗi Filter. WFS/WFS Operation Classes/DescribeFeatureTypeSolution/Get ParameterClasses/AbstractHttp Là 1 lớp ảo, có tác dụng lấy các tham số của DescribeFeatureType request . WFS/WFS Operation Classes/DescribeFeatureTypeSolution/Get ParameterClasses/HttpGetRequest Là lớp con của lớp WFS/WFS OperationClasses/DescribeFeatureTyp eSolution/GetParameterClasses/Abstr actHttp. Có tác dụng lấy các tham số của

DescribeFeatureType request được gởi lên bằng giao thức HTTP GET. WFS/WFS Operation Classes/DescribeFeatureTypeSolution/Get ParameterClasses/HttpPostRequest Là lớp con của lớp WFS/WFS OperationClasses/DescribeFeatureTyp eSolution/GetParameterClasses/Abstr actHttp. Có tác dụng lấy các tham số của

DescribeFeatureType request được gởi lên bằng giao thức HTTP POST. WFS/WFS Operation Classes/DescribeFeatureTypeSolution/Des cribeFeatureTypeSolution Có chức năng nhận 1 DescribeFeatureType request, lấy về mô tả của các loại Feature và tạo chuỗi response bằng Xml. WFS/WFS Operation Classes/GetFeatureSolution/GetParameter Classes/AbstractHttp Là 1 lớp ảo, có tác dụng lấy các tham số của GetFeature request . WFS/WFS Operation Classes/GetFeatureSolution/GetParameter Là lớp con của lớp WFS/WFS OperationClasses/GetFeatureSolution/

Chương 6. Cài đặt chương trình OpenGISServer

Classes/HttpGetRequest GetParameterClasses/AbstractHttp. Có tác dụng lấy các tham số của

GetFeature request được gởi lên

bằng giao thức HTTP GET. WFS/WFS Operation Classes/GetFeatureSolution/GetParameter Classes/HttpPostRequest Là lớp con của lớp WFS/WFS OperationClasses/GetFeatureSolution/ GetParameterClasses/AbstractHttp. Có tác dụng lấy các tham số của

GetFeature request được gởi lên

bằng giao thức HTTP POST. WFS/WFS Operation Classes/GetFeatureSolution/GetFeatureSo lution Có chức năng nhận 1 GetFeature request, truy vấn cơ sở dữ liệu để lấy về các Feature được yêu cầu và tạo chuỗi response bằng Xml. WFS/WFS Operation Classes/LockFeatureSolution/GetParamet erClasses/AbstractHttp Là 1 lớp ảo, có tác dụng lấy các tham số của LockFeature request . WFS/WFS Operation Classes/LockFeatureSolution/GetParamet erClasses/HttpGetRequest Là lớp con của lớp WFS/WFS OperationClasses/LockFeatureSolutio n/GetParameterClasses/AbstractHttp. Có tác dụng lấy các tham số của

LockFeature request được gởi lên

bằng giao thức HTTP GET. WFS/WFS Operation Classes/LockFeatureSolution/GetParamet erClasses/HttpPostRequest Là lớp con của lớp WFS/WFS OperationClasses/LockFeatureSolutio n/GetParameterClasses/AbstractHttp. Có tác dụng lấy các tham số của

LockFeature request được gởi lên

Chương 6. Cài đặt chương trình OpenGISServer

WFS/WFS Operation

Classes/LockFeatureSolution/LockFeature Solution

Có chức năng nhận 1 LockFeature

request, khóa các Feature theo yêu cầu và tạo chuỗi response bằng Xml. WFS/WFS Operation

Classes/LockFeatureSolution/DataBaseAc cess

Gồm các hàm thực hiện các thao tác trên cơ sở dữ liệu liên quan tới chức năng khóa và mở khóa các Feature. WFS/WFS Operation

Classes/TransactionSolution/OperationSol ution/HTTPGETDelete

Có chức năng nhận Transaction request với Operation là Delete, được gởi lên bằng giao thức HTTP GET, thực hiện xóa các Feature theo yêu cầu và tạo response tương ứng. WFS/WFS Operation

Classes/TransactionSolution/OperationSol ution/HTTPPOSTDelete

Có chức năng nhận Transaction request với Operation là Delete, được gởi lên bằng HTTP POST, thực hiện xóa các Feature theo yêu cầu và tạo response tương ứng

WFS/WFS Operation

Classes/TransactionSolution/OperationSol ution/HTTPPOSTUpdate

Có chức năng nhận Transaction request với Operation là Update,

được gởi lên bằng HTTP POST, thực hiện việc cập nhật các Feature theo yêu cầu và tạo response tương ứng WFS/WFS Operation

Classes/TransactionSolution/OperationSol ution/HTTPPOSTInsert

Có chức năng nhận Transaction request với Operation là Insert, được gởi lên bằng HTTP POST, thực hiện việc thêm các Feature theo yêu cầu và tạo response tương ứng. WFS/WFS Operation Classes/TransactionSolution/DataBaseAcc ess Gồm các hàm dùng để thao tác trên cơ sở dữ liệu. Thực hiện thêm, xóa, sửa các bảng trong csdl theo yêu cầu. (adsbygoogle = window.adsbygoogle || []).push({});

Chương 6. Cài đặt chương trình OpenGISServer

WFS/WFS Operation

Classes/TransactionSolution/TransactionS olution

Có chức năng nhận 1 Transaction request, thực hiện yêu cầu transaction tương ứng và trả về chuỗi response bằng Xml.

WFS/WFS Operation

Classes/GetCapabilitiesSolution

Có chức năng nhận 1 GetCapabilities request, lấy thông tin về các khả năng của server và trả về chuỗi response bằng Xml. WFS/WFS Operation Classes/FeatureRequest Chứa 1 loại Feature cần truy vấn và các điều kiện truy vấn đối với lớp đó. WFS/WFSSolution Nhận 1 WFS request, xác định loại request cụ thể và gọi lớp tương ứng để thực hiện request này Bảng 6.8.Các lớp trong chương trình

™ Chương trình có 1 trang ASP.NET ởđịa chỉ

http://localhost/OpenGISServer/VNesOpenGISServer.aspx

Trang này sẽ trực tiếp nhận các request từ client, thực hiện 1 số kiểm tra đểđảm bảo tính hợp lệ của request, xác định loại request là WFS hay WMS và gọi lớp tương ứng để đáp ứng request.

™ Các file Xml lưu trữ các thông tin về server.

ƒ File XmlFiles/WFS_Capabilities.xml: File này chứa nội dung của tài liệu

Xml dùng làm response cho request GetCapabilities.

ƒ File XmlFiles/ExceptionFrame.xml: File này chứa phần khung nội dung

của chuỗi Xml dùng làm response khi request có lỗi.

ƒ Các file trong thư mục WFS/FeatureTypeFiles: đây là các file chứa các tài liệu xml dùng để mô tả các loại Feature. Các file này hỗ trợ cho response của DescribeFeatureType request

Chương 7. Cài đặt các chương trình client

Chương 7. Cài đặt các chương trình client 7.1. Cài đặt chương trình OpenGisClientDemo

7.1.1. Giới thiệu

7.1.1.1.Tính năng

™ Chương trình OpenGISClient là 1 chương trình được cài đặt bằng C# ở dạng Window Form.

™ Chức năng của chương trình là minh họa 1 cách cụ thể, rõ ràng việc thực

hiện các request WFS và WMS lên các server hỗ trợ WFS và WMS.

™ Chương trình lưu 1 danh sách các server hỗ trợ WFS và WMS, có thể thêm

các server mới. Trong quá trình thực hiện request, ta có thể chọn bất kì server nào để gởi request và nhận kết quả từ server đó.

™ Các request mà OpenGISClient hỗ trợ gồm: ƒ WFS: • GetCapabilities • DescribeFeatureType • GetFeature • LockFeature • Transaction ƒ WMS: • GetCapabilities • GetMap

™ Chương trình sử dụng bộ thư viện CarbonTools. Bộ thư viện này hỗ trợ thực hiện request.

Chương 7. Cài đặt các chương trình client

7.1.1.2.Màn hình giao diện

7.1.1.2.1. Màn hình chính (adsbygoogle = window.adsbygoogle || []).push({});

Chương 7. Cài đặt các chương trình client

7.1.1.2.2. Màn hình minh họa thực hiện request WFS - GetCapabilities

Chương 7. Cài đặt các chương trình client

7.1.1.2.3. Màn hình minh họa thực hiện request WFS – DescribeFeatureType.

Chương 7. Cài đặt các chương trình client

7.1.1.2.4. Màn hình minh họa thực hiện request WFS – GetFeature

Chương 7. Cài đặt các chương trình client

7.1.1.2.5. Màn hình minh họa thực hiện request WFS – GetFeature

Chương 7. Cài đặt các chương trình client

7.1.1.2.6. Màn hình minh họa thực hiện request WFS – Transaction

Chương 7. Cài đặt các chương trình client

7.1.1.2.7. Màn hình minh họa thực hiện request WMS – GetCapabilities

Chương 7. Cài đặt các chương trình client

7.1.1.2.8. Màn hình minh họa thực hiện request WMS – GetMap

Chương 7. Cài đặt các chương trình client

7.1.2. Gởi request cho server

™ Sau khi xây dựng xong chuỗi request bằng Xml, ta cần phải gởi chuỗi request này lên cho server.

™ Trong .NET, ta có thể thực hiện việc gởi 1 request lên cho server theo 2 cách là: đồng bộ và bất đồng bộ

7.1.2.1.Thực hiện việc gởi request bằng phương pháp đồng bộ

™ Đối với phương pháp đồng bộ, sau khi thực hiện 1 request thì client phải chờ cho đến khi nhận xong response từ server, nó mới có thể thực hiện tiếp các tác vụ khác. Do đó, trong lúc nhận response từ server thì client không thể làm được việc gì khác.

™ Để gởi request bằng phương pháp đồng bộ, ta sử dụng 2 lớp là

HttpWebRequest HttpWebResponse.

7.1.2.1.1. Gởi request bằng phương pháp dồng bộ với giao thức HTTP GET

™ Trong trường hợp này chuỗi URL có thể chứa thêm các thông tin khác. ™ Ví dụ dưới đây gởi request đến 1 server có chuỗi URL là

string sURL =

“http://localhost/OpenGISServer/VNesOpenGISServer.aspx?SERVIC E=WFS&

VERSION=1.0.0&REQUEST=GetFeature&TypeName=buudien,quan,duong”

ƒ Chuỗi URL này có thêm các tham số là SERVICE, VERSION,

REQUEST, TypeName. (adsbygoogle = window.adsbygoogle || []).push({});

ƒ Tạo đối tượng HttpWebRequest và gởi chuỗi URL System.Net.HttpWebRequest httpRequest =

Chương 7. Cài đặt các chương trình client

ƒ Nhận kết quả trả về dưới dạng 1 stream. System.Net.WebResponse httpResponse = httpRequest.GetResponse();

System.IO.Stream stream = httpResponse.GetResponseStream(); ƒ Sau khi nhận dòng dữ liệu này, ta có thể lấy dữ liệu trong dòng dữ liệu dưới dạng chuỗi hoặc lưu dòng dữ liệu xuống file.

StreamReader reader = new StreamReader(stream); ƒ Chuyển kết quả sang 1 chuỗi.

string response = reader.ReadToEnd(); ƒ Lưu dòng dữ liệu xuống file.

FileStream file = new

FileStream("c:\\xml.xml",FileMode.Create,FileAccess.Write); int ch; do{ ch = stream.ReadByte(); if (ch!= -1) file.WriteByte((byte)ch); }while (ch != -1); file.Close();

7.1.2.1.2. Gởi request bằng phương pháp đồng bộ với giao thức HTTP POST

™ Trong trường hợp này nội dung cần gởi lên server được lưu trong phần body của request.

™ Ví dụ dưới đây gởi 1 request dưới dạng POST lên server. ƒ Server có địa chỉ là

sAddress=http://localhost/OpenGISServer/VNesOpenGISServer.aspx ƒ Nội dung cần gởi lên server này được lưu trong chuỗi sPostContent.

Chương 7. Cài đặt các chương trình client

• Tạo đối tượng HttpWebRequest và ghi nội dung của chuỗi sPostContent vào phần body của request.

System.Net.HttpWebRequest myHttpWebRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Creat e(sAddress); System.Text.ASCIIEncoding encoding=new System.Text.ASCIIEncoding(); byte[] byte1=encoding.GetBytes(sPostContent); //Chọn loại ContentType của dữ liệu cần gởi lên myHttpWebRequest.ContentType="application/x-www-form- urlencoded";

// Xác định chiều dài của chuỗi cần gởi lên

myHttpWebRequest.ContentLength=sPostContent.Text. Length;

myHttpWebRequest.Method = "POST";

Stream newStream = myHttpWebRequest.GetRequestStream(); newStream.Write(byte1,0,byte1.Length); newStream.Close(); System.Net.WebResponse httpResponse = myHttpWebRequest.GetResponse(); System.IO.Stream stream = httpResponse.GetResponseStream();

StreamReader reader = new StreamReader(stream); //Chuyển kết quả sang 1 chuỗi.

string response = reader.ReadToEnd(); stream.Close(); httpResponse.Close(); //Lấy kết quả trả về. System.Net.WebResponse httpResponse = httpRequest.GetResponse(); System.IO.Stream stream =

Chương 7. Cài đặt các chương trình client

7.1.2.2.Gởi request bằng phương pháp không đồng bộ

Khi gởi 1 request bằng phương pháp không đồng bộ, ta có thể tiếp tục thực hiện các tác vụ khác trong lúc nhận kết quả trả về bởi vì tác vụ nhận kết quả

từ server sẽđược thực hiện trong 1 tiểu trình khác.

7.1.2.2.1. Gởi request bằng phương pháp không đồng bộ với giao thức HTTP GET

™ Ví dụ dưới đây minh họa việc gởi request đến server bằng phương pháp không đồng bộ với giao thức HTTP GET.

ƒ Chương trình dưới đây là 1 chương trình dưới dạng console, có chức năng nhận 1 chuỗi URI từ dòng lệnh, yêu cầu tài nguyên từđịa chỉđó, in dữ liệu ra màn hình sau khi nó nhận xong dữ liệu từ server.

ƒ Chương trình định nghĩa 2 lớp là lớp RequestState, có tác dụng chuyển dữ liệu qua lại giữa các các lời gọi không đồng bộ và lớp ClientGetAsync dùng để tạo 1 request bằng phương pháp không đồng bộ

• Lớp RequestState lưu trạng thái của request trong suốt quá trình gọi các hàm để phục vụ request. Nó chứa 1 đối tượng WebRequest và 1 đối tượng Stream, đối tượng WebRequest chứa request hiện tại đến tài nguyên trên server và đối tượng Streamchứa dòng dữ liệu nhận được từ response của server, và 1 đối tuợng StreamBuilder chứa toàn bộ chuỗi response. Một đối tượng RequestState được dùng làm tham sốstate khi (adsbygoogle = window.adsbygoogle || []).push({});

Một phần của tài liệu tìm hiểu các dịch vụ WEB cho ứng dụng GIS và xây dựng ứng dụng minh họa khai thác dịch vụ (Trang 126)