2016-04-13 1 views
1

XMLをリスト(リスト<>)から所定の階層にフォー​​マットする必要があります。このリストには、銀行情報の場合、画像に示されているように複数の行にまたがってデータが表示されます。リストから複数の行に必要なデータが入れ子になったXML

enter image description here

XML出力は次のようにフォーマットする必要があります。

<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> 

私はすでにXMLにリストを変換した文字列を返すメソッドを持っています。しかし問題は、これがリストから1つの項目をフォーマットするだけであり、以下の項目に追加情報がある可能性があるということです。

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

それは、ウェブサイト/ポータルのですか? XSLT変換の使用はどうですか? –

+0

'XmlDocument'でXMLをビルドするのは楽しい経験ではありません。間違いなく['XElement'](https://msdn.microsoft.com/library/bb387089)もチェックしてください。 –

+0

@Vivek JainこれはWeb APIの一部です。私はXSLTを調べます – hatsjie

答えて

0

私は自分自身で答えを見つけましたが、これまでに書かれた最もきれいなコードではないかもしれません。しかし、それは仕事をします。

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; 

}

関連する問題