SSIS ile SharePoint InfoPath formlarından veri çekmek

Selamlar SSIS üzerine yazılarıma devam ediyorum.

Problem şu şekilde, SharePoint 2010 üzerinde InfoPath formlarını tutan bir listemiz var. InfoPath formlarında ek olarak Repeating table kontolüde kullanılmış.

Amacımız  SSIS ile SharePoint listesine bağlanıp bu InfoPath formlarını repeating table içersindeki bilgileriyle beraber okuyarak SQL Server’da bir tabloya yazmak.

Çözüm olarak daha öncede sıklıkla kullandığım Script Task komponentini kullandım. Script Task ile SharePoint’de ki lists.asmx web servisine bağlanarak XML olarak doldurulmuş InfoPath formlarını alıyorum ve XML’i okuyarak SQL tablosuna yazıyorum.

Control Flow yapım şu şekilde:

Capture

Görmüş olduğunuz gibi ilk olarak verileri atacağım SQL tablosunu temizliyorum. İkinci adımda Data Flow ile veri aktarımımı yapıyorum.

Data Flow’un içerside şu şekilde;

Capture

Data Flow’un içersinde en başta kaynak olarak tanımlanmış bir Script Component’i duruyor. Bütün web servise bağlanma, XML’i okuma ve verileri pipeline’a verme işini bu komponentin içersinde yapıyorum. Daha sonra SharePoint’den gelen verileri Derived Coloumn komponenti ile istediğim formata getiriyorum ve son olarak da SQL tablosuna yazıyorum.

Script Component’in içersine girmeden önce yapmamız gereken bir adım var. Bu adımda bir SharePoint webservis’ini kodumuzda kullanabilrmemiz için bu Web Servis’in bir proxy class’ını oluşturmamız gerekiyor. Ancak bu sayede web servis içersinde bulunan metodları kodumuz içersinde kullanabiliriz. Bu süreci ayrı bir yazı olarak sitemde burada bulabilirsiniz. Bu işlemi yaptıktan sonra elinizde myProxyClass.cs adında bir dosya olması gerekiyor. O dosyayı kaybetmeyin birazdan kullacağız.

Gelelim Script Component’in içersine;

İlk adım olarak yaptığım  script component’den çıkacak satırların kolonlarını tanımlamak. Burda her kolon için tipini ve adını tanımlamanız gerekiyor. Ben şahsen bütün kolonları String olarak tanımlıyorum. Daha sonra Data Flow’un içersinde Dervied Column ile tip değişikliği ve diğer düzenlemeleri yapıyorum. Bu yöntem performans açısından çok mantıklı olmayabilir fakat ilk baştaolan geliştirme sırasında çıkabilecek tip farklılığı sorunlarını ortadan kaldırıyor.

Capture

Şimdi sıra geldi kodu yazmaya soldaki menüden Script sekmesini seçip gelen ekranda Edit Script düğmesine basıyoruz.  Bu şekilde VS bize Script Component’in içersini ayrı bir pencerede açıyor. İlk olarak önceki adımlarda yarattığımız proxy class’ımızı projemize eklememiz gerekiyor. Ancak bu sayede web servisimizin metodlarından yararlanabileceğiz.

Ekleme işlemi çok basit. Solution Explorer’da projemizin adının üzerine gelip sağ tuşa basıyoruz daha sonra çıkan menüden Add düğmesine tıklayarak Add Existing Item’ı seçiyoruz. Çıkan arayüzden yaratığınız myProxyClass.cs’i seçin ve onaylayın.

Ayrıca yapmamız gereken bir küçük adım daha, web serivisi kullacağımız için projemizin referanslarına System.Web.Services dll’ini eklememiz gerekiyor. Bunu da yine Solution Explorer’dan Refernces klasörüne sağ tıklayarak çıkan Add Reference düğmesine basarak yapıyoruz. Çıkan arayüzden sol tarafda Assemblies ve Framework seçili olduğundan emin olduktan sonra listeden System.Web.Services dll’ini seçip OK basıyoruz.

Bu sayede artık projemizde web servisimizin bütün metodlarını kullanabilir hale geldik. References ‘a ilgili dll’imiz ekledik ve web servisimizin proxyclass2’ını ekledik.

Şimdi sıra geldi kodumuzu yazmaya;

İlk olarak web servis objemizden bir kopya yaratıyoruz. Daha sonra yarattığımız objeye nereye bağlanacağını gösteren URL tanımlıyoruz. Son olarakta verdiğimiz URL’de olan web servis’e bağlanmak için ihtiyacımız olan kullanıcı bilgilerini veriyoruz.

Lists ListsService = new Lists(); //Web Service proxy class
 ListsService.Url = "https://xxxx.com/sites/xxxxx/xxxx/xxxxx/_vti_bin/lists.asmx";
 ListsService.Credentials = new System.Net.NetworkCredential("<<Username>>", "<<Password>>", "<<DOMAIN>>");

İkinci olarak XML okumamız için gereken birkaç temel yapıyı oluşturuyoruz. Bu kısım genellikle çok değişmez ama isterseniz detaylıca araştırabilirsiniz ne yaptığımı.

XmlDocument xmlQueryDoc = new XmlDocument();
 XmlNode ndQuery = xmlQueryDoc.CreateNode(XmlNodeType.Element, "Query", ""); //Create <Query> node
 XmlNode ndViewFields = xmlQueryDoc.CreateNode(XmlNodeType.Element, "ViewFields", ""); //Create <Query> node
 XmlNode ndQueryOptions = xmlQueryDoc.CreateNode(XmlNodeType.Element, "QueryOptions", ""); //Create <Query> node
ndQuery.InnerText = "";
 ndViewFields.InnerXml = "";
 ndQueryOptions.InnerXml = "<ViewAttributes Scope='Recursive' />";

Burada üzerinde durmak istediğim tek kısım ndQueryOptions.InnerXml = “<ViewAttributes Scope=’Recursive’ />”; kısmı bu özelliği XML sorgunuza vermezseniz sorgu geri dönerken XML içersinde iç içe olan yapıları getirmez. Bu kısım beni bazı durumlarda deli etmişti eskiden, küçük ama önemli bir özellik bence.

Evet XML’e yapacağımız sorgunun özelliklerini belirttikten sonra artık sıra geldi sorguyu çalıştırmaya. Aşağıdaki tek satır ile web servisimizin GetListItems metodunu çağırıyoruz ve cevabı XMLNode tipindeki objeye yönlendiriyoruz.

XmlNode ndListItems = ListsService.GetListItems("Orders", null, ndQuery, ndViewFields, null, ndQueryOptions, null);

Daha sonra bu XML objesinin alt katmanlarında da üzerinde ilerleyebilmek için aşağıdaki kodu kullanıyorum.

XmlNodeList oNodes = ndListItems.ChildNodes;

Artık elimde olan oNodes listesindeki her XMLNode tipindeki objenin üzerinden ilerleyerek detaylı okumama başlayabilirim.

foreach (XmlNode node in oNodes)
 {
 XmlNodeReader objReader = new XmlNodeReader(node);
while (objReader.Read())
 {
if (objReader["ows_Request_x0020_No"] != null)
 {
if (objReader["ows_EncodedAbsUrl"] != null)
 {}
}
}
}

Yukarıda XMLNode’ların üzerinden ilerleyerek XML içersinde bulunan her node için belli özelliklerin olup olmadığına bakarak ows_EncodedAbsUrl tag’ini buluyorum. Bunu yapmamın nedeni bağlandığım SharePoint listesinde ki her girdide InfoPath formunun adresi duruyor. Yani her girdi için o girdiye ait olan InfoPath formuna ayrıca ulaşmam gerekiyor ve form verisini oradan okumam gerekiyor. Bu nedenle ilk olarak ows_EncodedAbsUrl dan aldığım adrese bağlanıp ordaki XML verisini okuyorum.

Bunuda şu şekilde yapıyorum;

StringBuilder oBuilder = new StringBuilder();
 System.IO.StringWriter oStringWriter = new System.IO.StringWriter(oBuilder);
 System.Xml.XmlTextWriter oXmlWriter = new System.Xml.XmlTextWriter(oStringWriter);
 oXmlWriter.Formatting = System.Xml.Formatting.Indented;
System.Net.CredentialCache mycache = new System.Net.CredentialCache();
 mycache.Add(new Uri(objReader["ows_EncodedAbsUrl"].ToString()), "NTLM", new System.Net.NetworkCredential("<<Username>>", "<<Password>>", "<<Domain>>"));
System.Net.WebClient _wc = new System.Net.WebClient();
_wc.Credentials = mycache;
System.IO.Stream s = _wc.OpenRead( objReader["ows_EncodedAbsUrl"].ToString() + "?noredirect=true");
System.IO.StreamReader _xmlFile = new System.IO.StreamReader(s);
string _content = _xmlFile.ReadToEnd();
 System.Xml.XmlDocument _doc = new System.Xml.XmlDocument();
 _doc.LoadXml(_content);

Dikkat ederseniz ilgili adrese NTLM kullanarak bağlanıyorum. Bu kısım sizin çözümünüzde farklı olabilir dikkat etmekte yarar var. En son satırda XMLDocument tipindeki _doc değişkenine InfoPath formunun içeriğini yüklüyorum. Bu sayede artık _doc üzerinde XPATH ile istediğim elemana ulaşıp verimi çekebilirim.

Bu arada benim çözmek için bir kaç saatimi alan bir kısım üzerine durmak istiyorum _doc.LoadXml(_content); satırından sonra _doc XMLDocument değişkenine bir kaç namespace eklemeniz gerekiyor bunu yapmazsanız XPATH sorgularınız boş gelir.

System.Xml.XPath.XPathNavigator navigator = _doc.CreateNavigator();
 System.Xml.XmlNamespaceManager manager = new System.Xml.XmlNamespaceManager(navigator.NameTable);
manager.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2013-08-21T08:32:28");
 manager.AddNamespace("pc", "http://schemas.microsoft.com/office/infopath/2007/PartnerControls");

Bunuda yaptıktan sonra almak istediğim bütün değerler için XPATH sorgularını hazırlıyorum.

string XPath_RequestNo = "/my:SABU_Product_Ordering/my:OrderingMainGroup/my:RequestNo";
 string XPath_DisplayName = "/my:SABU_Product_Ordering/my:OrderingMainGroup/my:Requestor/pc:Person/pc:DisplayName";
 string XPath_AccountID = "/my:SABU_Product_Ordering/my:OrderingMainGroup/my:Requestor/pc:Person/pc:AccountId";
 string XPath_AccountType = "/my:SABU_Product_Ordering/my:OrderingMainGroup/my:Requestor/pc:Person/pc:AccountType";
 string XPath_RequestForName = "/my:SABU_Product_Ordering/my:OrderingMainGroup/my:RequestedForName";
 string CostCenter = "/my:SABU_Product_Ordering/my:OrderingMainGroup/my:CostCenter";
 string Department = "/my:SABU_Product_Ordering/my:OrderingMainGroup/my:Department";
 string EmployeeType = "/my:SABU_Product_Ordering/my:OrderingMainGroup/my:EmployeeType";
 string MonthlyPeriod = "/my:SABU_Product_Ordering/my:OrderingMainGroup/my:MonthlyPeriod";
 string ProductType = "/my:SABU_Product_Ordering/my:RepeatingItemGroups/my:RepeatingItemGroup/my:Items/my:ProductType";
 string ProductCode = "/my:SABU_Product_Ordering/my:RepeatingItemGroups/my:RepeatingItemGroup/my:Items/my:ProductCode";
 string ProductDescription = "/my:SABU_Product_Ordering/my:RepeatingItemGroups/my:RepeatingItemGroup/my:Items/my:ProductDescription";
 string ProductQuantity = "/my:SABU_Product_Ordering/my:RepeatingItemGroups/my:RepeatingItemGroup/my:Items/my:Quantity";
 string ProductCost = "/my:SABU_Product_Ordering/my:RepeatingItemGroups/my:RepeatingItemGroup/my:Items/my:Cost";
 string TotalCost = "/my:SABU_Product_Ordering/my:TotalCostGroup/my:TotalCost";
 string OrderStatus = "/my:SABU_Product_Ordering/my:CommonFieldsGroup/my:OrderStatus";
XmlNodeList xnList = _doc.SelectNodes("/my:SABU_Product_Ordering/my:RepeatingItemGroups/my:RepeatingItemGroup/my:Items", manager);

Son satır dikkatinizi çekmiştir, dikkat ederseniz o satırda InfoPath formundaki RepeatingItemGroup’un içersindeki girdileri ayrıca bir XMLNodeList değişkenine atıyorum bu sayede repeating table içersindeki her bir satırı üstte tanımladığım diğer ortak form bilgileri ile beraber SQL Tablosuna yazacağım. Aşağıda bu yazdığımı bulabilirsini.

foreach (XmlNode xn in xnList)
 {
 OutputBuffer.AddRow();
 OutputBuffer.RequestNo = _doc.SelectSingleNode(XPath_RequestNo, manager) != null ? _doc.SelectSingleNode(XPath_RequestNo, manager).InnerText : string.Empty;
OutputBuffer.DisplayName = _doc.SelectSingleNode(XPath_DisplayName, manager) != null ? _doc.SelectSingleNode(XPath_DisplayName, manager).InnerText : string.Empty;
 OutputBuffer.AccountID = _doc.SelectSingleNode(XPath_AccountID, manager) != null ? _doc.SelectSingleNode(XPath_AccountID, manager).InnerText : string.Empty;
 OutputBuffer.AccountType = _doc.SelectSingleNode(XPath_AccountType, manager) != null ? _doc.SelectSingleNode(XPath_AccountType, manager).InnerText : string.Empty;
OutputBuffer.RequestForName = _doc.SelectSingleNode(XPath_RequestForName, manager) != null ? _doc.SelectSingleNode(XPath_RequestForName, manager).InnerText : string.Empty;
 OutputBuffer.CostCenter = _doc.SelectSingleNode(CostCenter, manager) != null ? _doc.SelectSingleNode(CostCenter, manager).InnerText : string.Empty;
 OutputBuffer.Department = _doc.SelectSingleNode(Department, manager) != null ? _doc.SelectSingleNode(Department, manager).InnerText : String.Empty;
 OutputBuffer.EmployeeType = _doc.SelectSingleNode(EmployeeType, manager) != null ? _doc.SelectSingleNode(EmployeeType, manager).InnerText : String.Empty;
 OutputBuffer.MonthlyPeriod = _doc.SelectSingleNode(MonthlyPeriod, manager) != null ? _doc.SelectSingleNode(MonthlyPeriod, manager).InnerText : String.Empty;
OutputBuffer.ProductType = _doc.SelectSingleNode(ProductType, manager) != null ? xn.ChildNodes[0].InnerText : String.Empty;
 OutputBuffer.ProductCode = _doc.SelectSingleNode(ProductCode, manager) != null ? xn.ChildNodes[5].InnerText : String.Empty;
 OutputBuffer.ProductDescription = _doc.SelectSingleNode(ProductDescription, manager) != null ? xn.ChildNodes[3].InnerText : String.Empty;
 OutputBuffer.ProductQuantity = _doc.SelectSingleNode(ProductQuantity, manager) != null ? xn.ChildNodes[1].InnerText : String.Empty;
 OutputBuffer.ProductCost = _doc.SelectSingleNode(ProductCost, manager) != null ? xn.ChildNodes[4].InnerText : String.Empty;
OutputBuffer.TotalCost = _doc.SelectSingleNode(TotalCost, manager) != null ? _doc.SelectSingleNode(TotalCost, manager).InnerText : String.Empty;
 OutputBuffer.OrderStatus = _doc.SelectSingleNode(OrderStatus, manager).InnerText !=null ? _doc.SelectSingleNode(OrderStatus, manager).InnerText : String.Empty;
 }

Evet en sonunda kodumuzun sonuna geldik. Özetlemek gerekirse şu adımlardan geçtik,

1. SharePoint’in web servisine bağlanıyoruz.

2. İstediğimiz liste adını ve view’i veriyoruz ve gelen veriyi XMLNode olarak tutyoruz.

3. Aldığımız XMLNode verisinin içersinde her bir liste öğesi için ows_EncodedAbsUrl özelliğini buluyoruz.

4. ows_EncodedAbsUrl dan aldığımız URL’e gidip InfoPath formunun detaylı verisini ve repeating table verisini tutan XML’e bağlanıyoruz.

5. Bağlandığımız InfoPath XML versini XMLDocument olarak kaydedip XPATH sorgusu yapabilmek için bir kaç Namespace ekliyoruz.

6. En son olarak repeating table içersindeki verileri alıyoruz ve çıktı olarak Script Component’e bağlıyoruz.

Bütün C# Kodunu aşağıda bulabilirsiniz;

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
using System.Xml;
using System.Net;
using System.Text;
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
 public override void PreExecute()
 {
 base.PreExecute();
 }
public override void PostExecute()
 {
 base.PostExecute();
 }
public override void CreateNewOutputRows()
 {
 Lists ListsService = new Lists(); //Web Service proxy class
 ListsService.Url = "https://xxxxx.com/sites/xxxxxx/xxxxx/xxxxx/_vti_bin/lists.asmx";
 ListsService.Credentials = new System.Net.NetworkCredential("<<Username>>", "<<Password>>", "<<Domain>>");

 XmlDocument xmlQueryDoc = new XmlDocument();
 XmlNode ndQuery = xmlQueryDoc.CreateNode(XmlNodeType.Element, "Query", ""); //Create <Query> node
 XmlNode ndViewFields = xmlQueryDoc.CreateNode(XmlNodeType.Element, "ViewFields", ""); //Create <Query> node
 XmlNode ndQueryOptions = xmlQueryDoc.CreateNode(XmlNodeType.Element, "QueryOptions", ""); //Create <Query> node
ndQuery.InnerText = "";
 ndViewFields.InnerXml = "";
 ndQueryOptions.InnerXml = "<ViewAttributes Scope='Recursive' />";
XmlNode ndListItems = ListsService.GetListItems("Orders", null, ndQuery, ndViewFields, null, ndQueryOptions, null);
XmlNodeList oNodes = ndListItems.ChildNodes;
foreach (XmlNode node in oNodes)
 {
 XmlNodeReader objReader = new XmlNodeReader(node);
while (objReader.Read())
 {
 if (objReader["ows_Request_x0020_No"] != null)
 {
 if (objReader["ows_EncodedAbsUrl"] != null)
 {
 StringBuilder oBuilder = new StringBuilder();
 System.IO.StringWriter oStringWriter = new System.IO.StringWriter(oBuilder);
 System.Xml.XmlTextWriter oXmlWriter = new System.Xml.XmlTextWriter(oStringWriter);
 oXmlWriter.Formatting = System.Xml.Formatting.Indented;
System.Net.CredentialCache mycache = new System.Net.CredentialCache();
 mycache.Add(new Uri(objReader["ows_EncodedAbsUrl"].ToString()), "NTLM", new System.Net.NetworkCredential("<<Username>>", "<<Password>>", "<<Domain>>"));
System.Net.WebClient _wc = new System.Net.WebClient();
_wc.Credentials = mycache;
System.IO.Stream s = _wc.OpenRead( objReader["ows_EncodedAbsUrl"].ToString() + "?noredirect=true");
System.IO.StreamReader _xmlFile = new System.IO.StreamReader(s);
string _content = _xmlFile.ReadToEnd();
 System.Xml.XmlDocument _doc = new System.Xml.XmlDocument();
 _doc.LoadXml(_content);
System.Xml.XPath.XPathNavigator navigator = _doc.CreateNavigator();
 System.Xml.XmlNamespaceManager manager = new System.Xml.XmlNamespaceManager(navigator.NameTable);
manager.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2013-08-21T08:32:28");
 manager.AddNamespace("pc", "http://schemas.microsoft.com/office/infopath/2007/PartnerControls");
string XPath_RequestNo = "/my:SABU_Product_Ordering/my:OrderingMainGroup/my:RequestNo";
 string XPath_DisplayName = "/my:SABU_Product_Ordering/my:OrderingMainGroup/my:Requestor/pc:Person/pc:DisplayName";
 string XPath_AccountID = "/my:SABU_Product_Ordering/my:OrderingMainGroup/my:Requestor/pc:Person/pc:AccountId";
 string XPath_AccountType = "/my:SABU_Product_Ordering/my:OrderingMainGroup/my:Requestor/pc:Person/pc:AccountType";
 string XPath_RequestForName = "/my:SABU_Product_Ordering/my:OrderingMainGroup/my:RequestedForName";
 string CostCenter = "/my:SABU_Product_Ordering/my:OrderingMainGroup/my:CostCenter";
 string Department = "/my:SABU_Product_Ordering/my:OrderingMainGroup/my:Department";
 string EmployeeType = "/my:SABU_Product_Ordering/my:OrderingMainGroup/my:EmployeeType";
 string MonthlyPeriod = "/my:SABU_Product_Ordering/my:OrderingMainGroup/my:MonthlyPeriod";
 string ProductType = "/my:SABU_Product_Ordering/my:RepeatingItemGroups/my:RepeatingItemGroup/my:Items/my:ProductType";
 string ProductCode = "/my:SABU_Product_Ordering/my:RepeatingItemGroups/my:RepeatingItemGroup/my:Items/my:ProductCode";
 string ProductDescription = "/my:SABU_Product_Ordering/my:RepeatingItemGroups/my:RepeatingItemGroup/my:Items/my:ProductDescription";
 string ProductQuantity = "/my:SABU_Product_Ordering/my:RepeatingItemGroups/my:RepeatingItemGroup/my:Items/my:Quantity";
 string ProductCost = "/my:SABU_Product_Ordering/my:RepeatingItemGroups/my:RepeatingItemGroup/my:Items/my:Cost";
 string TotalCost = "/my:SABU_Product_Ordering/my:TotalCostGroup/my:TotalCost";
 string OrderStatus = "/my:SABU_Product_Ordering/my:CommonFieldsGroup/my:OrderStatus";
XmlNodeList xnList = _doc.SelectNodes("/my:SABU_Product_Ordering/my:RepeatingItemGroups/my:RepeatingItemGroup/my:Items", manager);
foreach (XmlNode xn in xnList)
 {
 OutputBuffer.AddRow();
 OutputBuffer.RequestNo = _doc.SelectSingleNode(XPath_RequestNo, manager) != null ? _doc.SelectSingleNode(XPath_RequestNo, manager).InnerText : string.Empty;
OutputBuffer.DisplayName = _doc.SelectSingleNode(XPath_DisplayName, manager) != null ? _doc.SelectSingleNode(XPath_DisplayName, manager).InnerText : string.Empty;
 OutputBuffer.AccountID = _doc.SelectSingleNode(XPath_AccountID, manager) != null ? _doc.SelectSingleNode(XPath_AccountID, manager).InnerText : string.Empty;
 OutputBuffer.AccountType = _doc.SelectSingleNode(XPath_AccountType, manager) != null ? _doc.SelectSingleNode(XPath_AccountType, manager).InnerText : string.Empty;
OutputBuffer.RequestForName = _doc.SelectSingleNode(XPath_RequestForName, manager) != null ? _doc.SelectSingleNode(XPath_RequestForName, manager).InnerText : string.Empty;
 OutputBuffer.CostCenter = _doc.SelectSingleNode(CostCenter, manager) != null ? _doc.SelectSingleNode(CostCenter, manager).InnerText : string.Empty;
 OutputBuffer.Department = _doc.SelectSingleNode(Department, manager) != null ? _doc.SelectSingleNode(Department, manager).InnerText : String.Empty;
 OutputBuffer.EmployeeType = _doc.SelectSingleNode(EmployeeType, manager) != null ? _doc.SelectSingleNode(EmployeeType, manager).InnerText : String.Empty;
 OutputBuffer.MonthlyPeriod = _doc.SelectSingleNode(MonthlyPeriod, manager) != null ? _doc.SelectSingleNode(MonthlyPeriod, manager).InnerText : String.Empty;
OutputBuffer.ProductType = _doc.SelectSingleNode(ProductType, manager) != null ? xn.ChildNodes[0].InnerText : String.Empty;
 OutputBuffer.ProductCode = _doc.SelectSingleNode(ProductCode, manager) != null ? xn.ChildNodes[5].InnerText : String.Empty;
 OutputBuffer.ProductDescription = _doc.SelectSingleNode(ProductDescription, manager) != null ? xn.ChildNodes[3].InnerText : String.Empty;
 OutputBuffer.ProductQuantity = _doc.SelectSingleNode(ProductQuantity, manager) != null ? xn.ChildNodes[1].InnerText : String.Empty;
 OutputBuffer.ProductCost = _doc.SelectSingleNode(ProductCost, manager) != null ? xn.ChildNodes[4].InnerText : String.Empty;
OutputBuffer.TotalCost = _doc.SelectSingleNode(TotalCost, manager) != null ? _doc.SelectSingleNode(TotalCost, manager).InnerText : String.Empty;
 OutputBuffer.OrderStatus = _doc.SelectSingleNode(OrderStatus, manager).InnerText !=null ? _doc.SelectSingleNode(OrderStatus, manager).InnerText : String.Empty;
 }
 }
 }
 }
 }
 }
}
Reklamlar

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s