2016-04-13 23 views
1

Bir XML'i bir listeden belirli bir hiyerarşiye biçimlendirmem gerekiyor (Liste <>). Liste, bankacılık bilgileri için, görüntüde gösterildiği gibi birden fazla sıraya yayılan verileri içerir.Birden çok satırdaki gerekli verilerle listeden iç içe XML

enter image description here

XML çıktısı aşağıdaki gibi biçimlendirilmiş olması gerekir:

<ROOT> 
    <DocumentElement> 
    <Supplier> 
     <Company>STV</Company> 
     <Code>000199</Code> 
     <Name>TrafTrans</Name> 
     <BankAccounts> 
     <SupplierBankAccount> 
      <Bban>220-012510-63</Bban> 
      <Name>B1</Name> 
     </SupplierBankAccount> 
     <SupplierBankAccount> 
      <Bban>RUIL</Bban> 
      <Name>RUIL</Name> 
     </SupplierBankAccount> 
     </BankAccounts> 
     <SupplierAddresses> 
     <SupplierAddress> 
      <Type>PostalAddress</Type> 
      <Name>Loc TrafTrans</Name> 
      <IsDefault>true</IsDefault> 
      <AddressParts> 
      <SupplierAddressPart> 
       <AddressPartKey>STREET_NAME</AddressPartKey> 
       <AddressPartText>Somewhere</AddressPartText> 
      </SupplierAddressPart> 
      <SupplierAddressPart> 
       <AddressPartKey>COUNTRY</AddressPartKey> 
       <AddressPartText>SPAIN</AddressPartText> 
      </SupplierAddressPart> 
      </AddressParts> 
     </SupplierAddress> 
     </SupplierAddresses> 
    </Supplier> 
    </DocumentElement> 
</ROOT> 

Zaten bir XML listesini dönüştürür ve bir dize döndürür bir yöntemi var. Fakat sorun şu ki, bu liste listeden sadece bir öğe biçimlendiriyor ve aşağıdaki öğelerde ek bilgi olabilir. Ben cevabı kendim buldum

public static string SuppliersToXML(List<SupplierItem> supplier) 
{ 
    CultureInfo ci = new CultureInfo("en-US"); 
    XmlDocument doc = new XmlDocument(); 
    var root = doc.CreateElement("ROOT"); 
    var rootNode = doc.AppendChild(root); 
    var docElem = doc.CreateElement("DocumentElement"); 
    var docElemNode = rootNode.AppendChild(docElem); 

    foreach (var item in supplier) 
    { 
     var supplierElem = doc.CreateElement("Supplier"); 
     var companyElem = (XmlNode)doc.CreateElement("Company"); 
     companyElem.InnerText = item.Company.ToString(); 
     //more code... 

     supplierElem.AppendChild(companyElem); 
     //more code... 
     } 
    return doc.OuterXml; 
} 
+0

bir web sitesi/portal

public static string SuppliersToXML(List<SupplierItem> supplier) 

{

//A distinct select is needed because bank info can be on multiple lines. So first a list is generated with correct info except for bank information List<SupplierItem> distinctsupplier = supplier .GroupBy(p => p.Code) .Select(g => g.First()) .ToList(); CultureInfo ci = new CultureInfo("en-US"); XmlDocument doc = new XmlDocument(); var root = doc.CreateElement("ROOT"); var rootNode = doc.AppendChild(root); var docElem = doc.CreateElement("DocumentElement"); var docElemNode = rootNode.AppendChild(docElem); foreach (var item in distinctsupplier) { var supplierElem = doc.CreateElement("Supplier"); var companyElem = (XmlNode)doc.CreateElement("Company"); companyElem.InnerText = item.Company.ToString(); var codeElem = (XmlNode)doc.CreateElement("Code"); codeElem.InnerText = item.Code.ToString(); var codeName = (XmlNode)doc.CreateElement("Name"); codeName.InnerText = item.Name.ToString(); //supplieridentifier part var supplierIdsElem = doc.CreateElement("SupplierIdentifiers"); var supplierIdElem = doc.CreateElement("SupplierIdentifier"); var supplierIdValueElem = (XmlNode)doc.CreateElement("SupplierIDValue"); supplierIdValueElem.InnerText = item.SupplierIDValue; //supplieraddress part var supplierAddressesElem = doc.CreateElement("SupplierAddresses"); var supplierAddressElem = doc.CreateElement("SupplierAddress"); var supplierTypeValueElem = (XmlNode)doc.CreateElement("Type"); supplierTypeValueElem.InnerText = item.Type; var supplierNameValueElem = (XmlNode)doc.CreateElement("Name"); supplierNameValueElem.InnerText = item.AddressName; var supplierDefaultValueElem = (XmlNode)doc.CreateElement("IsDefault"); supplierDefaultValueElem.InnerText = item.AddressIsDefault; //address part var AddressPartElem = doc.CreateElement("AddressParts"); var supplierAddressPartsElem = doc.CreateElement("SupplierAddressPart"); //Street var AddressPartElemStreetKeyElem = (XmlNode)doc.CreateElement("AddressPartKey"); AddressPartElemStreetKeyElem.InnerText = item.AddressStreetKey; var AddressPartElemStreetValueElem = (XmlNode)doc.CreateElement("AddressPartText"); AddressPartElemStreetValueElem.InnerText = item.AddressStreetText; //Country var AddressPartElemCountryKeyElem = (XmlNode)doc.CreateElement("AddressPartKey"); AddressPartElemCountryKeyElem.InnerText = item.AddressCountryKey; var AddressPartElemCountryValueElem = (XmlNode)doc.CreateElement("AddressPartText"); AddressPartElemCountryValueElem.InnerText = item.AddressCountryText; //add elements to supplierelem supplierElem.AppendChild(companyElem); supplierElem.AppendChild(codeElem); supplierElem.AppendChild(codeName); //bankaccounts part var bankAccountElem = doc.CreateElement("BankAccounts"); //select all rows that contain multiple lines, so the bank info can be extracted, for a certain supplier var bankInformation = supplier.Where(s => s.Code == item.Code).ToList(); foreach (var bankitem in bankInformation) { if (item.Code == bankitem.Code) { var bankAccountSupplElem = doc.CreateElement("SupplierBankAccount"); var bankAccountBbanElem = doc.CreateElement("Bban"); var bankAccountBbanValueElem = (XmlNode)doc.CreateElement("Bban"); bankAccountBbanValueElem.InnerText = bankitem.Bban; var bankAccountNameElem = doc.CreateElement("Name"); var bankAccountNameValueElem = (XmlNode)doc.CreateElement("Name"); bankAccountNameValueElem.InnerText = bankitem.BankName; var bankAccountElemNode = supplierElem.AppendChild(bankAccountElem); var bankAccountSupplElemNode = bankAccountElemNode.AppendChild(bankAccountSupplElem); bankAccountSupplElemNode.AppendChild(bankAccountBbanValueElem); bankAccountSupplElemNode.AppendChild(bankAccountNameValueElem); } } //add address elements to supplierelem var supplierAddressesElemNode = supplierElem.AppendChild(supplierAddressesElem); var supplierAddressElemNode = supplierAddressesElemNode.AppendChild(supplierAddressElem); supplierAddressElemNode.AppendChild(supplierTypeValueElem); supplierAddressElemNode.AppendChild(supplierNameValueElem); supplierAddressElemNode.AppendChild(supplierDefaultValueElem); //add addressparts to supplieraddressesnode //Street var AddressPartElemNode = supplierAddressElemNode.AppendChild(AddressPartElem); var supplierAddressPartsElemNode = AddressPartElemNode.AppendChild(supplierAddressPartsElem); supplierAddressPartsElemNode.AppendChild(AddressPartElemStreetKeyElem); supplierAddressPartsElemNode.AppendChild(AddressPartElemStreetValueElem); //Country (first reinitialize supplieraddresspart) supplierAddressPartsElem = doc.CreateElement("SupplierAddressPart"); var supplierAddressPartsCountryElemNode = AddressPartElemNode.AppendChild(supplierAddressPartsElem); supplierAddressPartsCountryElemNode.AppendChild(AddressPartElemCountryKeyElem); supplierAddressPartsCountryElemNode.AppendChild(AddressPartElemCountryValueElem); //add all supplierelements to docelemnode docElemNode.AppendChild(supplierElem); } return doc.OuterXml; 

} var mı? XSLT dönüşümleri nasıl kullanılır? –

+0

Bina XML'i XmlDocument ile hoş bir deneyim değildir. Kesinlikle ['XElement'] 'i (https://msdn.microsoft.com/library/bb387089) kontrol edin. –

+0

@Vivek Jain bir web api'nin bir parçasıdır. XSLT – hatsjie

cevap

0

, bu güzel kod şimdiye kadar yazılmış olmayabilir. Ama iş yapıyor.