Home > Mobile >  c# XML transformation
c# XML transformation

Time:07-23

i need help for below xml. I wonder how can I bring the XML below, I've been trying for a very long time, but it didn't work. I would be grateful if you could help with this.

I can do the same thing in php, but since my data is a little big, php takes a lot of time, I read the file from the web service with c# and save it as xml, but it didn't work out as I wanted.

<ResultOfProductList xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ServerCode>kenan</ServerCode>
<ClientCode>B124565</ClientCode>
<Username>karanfil</Username>
<ClientIPAddress>78.135.235.3</ClientIPAddress>
<Successful>true</Successful>
<RequestDate>2022-07-22T12:28:54.6238843 03:00</RequestDate>
<ElapsedTimeMS>17</ElapsedTimeMS>
<MethodType>GetAllProductsByParts</MethodType>
<Result EndOfProducts="false">
<CustomerCode>B124565</CustomerCode>
<CustomerName>kenan</CustomerName>
<Date>2022-07-22T12:28:54.6238843 03:00</Date>
<Brands>
<Brand ID="174" Lang="tr" BrandName="PARTSMALL-KORE" StandardName=""/>
</Brands>
<Products>
<Product ID="134898" BrandID="174" ProductCode="KR-PML-PTA-086" ProducerCode="" MinOrderAmount="1" PiecesInBox="1" Unit="PCE" New="false">
<ProductNames>
<ProductName Lang="tr">VITES HALATI ( HYUNDAI : ACCENT 95-00 )</ProductName>
</ProductNames>
<BaseOeNr>43794-22000</BaseOeNr>
<Pricing>
<ListPriceCurrency>USD</ListPriceCurrency>
<LocalCurrency>TLY</LocalCurrency>
<CurrencyRate>17.6599</CurrencyRate>
<ListPriceWoVAT>31.24</ListPriceWoVAT>
<LocalListPriceWVat>651.0004</LocalListPriceWVat>
<LocalListPriceWoVat>551.695251</LocalListPriceWoVat>
<LocalNetPriceWVat>377.580261</LocalNetPriceWVat>
<LocalNetPriceWoVat>319.983246</LocalNetPriceWoVat>
<Discount1>42</Discount1>
<Discount2>0</Discount2>
<Discount3>0</Discount3>
<Discount4>0</Discount4>
<Discount5>0</Discount5>
<Discount6>0</Discount6>
<InDiscount>false</InDiscount>
</Pricing>
<Stocks>
<Stock WarehouseID="1" Equality="Eq">0</Stock>
<Stock WarehouseID="7" Equality="Eq">0</Stock>
<Stock WarehouseID="4" Equality="Eq">0</Stock>
<Stock WarehouseID="2" Equality="Eq">0</Stock>
<Stock WarehouseID="5" Equality="Eq">0</Stock>
</Stocks>
</Product>
</Result>
</ResultOfProductList>

Desired output

<Products>
     <Product>
          <ID>134898</ID>
          <BrandID>174</BrandID>
          <BaseOeNr>43794-22000</BaseOeNr>
          <ProductCode>KR-PML-PTA-086</ProductCode>
          <ProductName>VITES HALATI ( HYUNDAI : ACCENT 95-00 )</ProductName>
          <LocalCurrency>TLY</LocalCurrency>
          <LocalNetPriceWVat>377.580261</LocalNetPriceWVat>
          <Stocks>WarehouseID=1   WarehouseID=7   WarehouseID=4   WarehouseID=2   WarehouseID=5 </Stocks>
</Product>
</Products>

enter image description here

CodePudding user response:

Here is XSLT based solution.

It is just not clear if the <Stocks> element value is what you need.

Input XML

<?xml version="1.0"?>
<ResultOfProductList xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <ServerCode>kenan</ServerCode>
    <ClientCode>B124565</ClientCode>
    <Username>karanfil</Username>
    <ClientIPAddress>78.135.235.3</ClientIPAddress>
    <Successful>true</Successful>
    <RequestDate>2022-07-22T12:28:54.6238843 03:00</RequestDate>
    <ElapsedTimeMS>17</ElapsedTimeMS>
    <MethodType>GetAllProductsByParts</MethodType>
    <Result EndOfProducts="false">
        <CustomerCode>B124565</CustomerCode>
        <CustomerName>kenan</CustomerName>
        <Date>2022-07-22T12:28:54.6238843 03:00</Date>
        <Brands>
            <Brand ID="174" Lang="tr" BrandName="PARTSMALL-KORE" StandardName=""/>
        </Brands>
        <Products>
            <Product ID="134898" BrandID="174" ProductCode="KR-PML-PTA-086" ProducerCode="" MinOrderAmount="1" PiecesInBox="1" Unit="PCE" New="false">
                <ProductNames>
                    <ProductName Lang="tr">VITES HALATI ( HYUNDAI : ACCENT 95-00 )</ProductName>
                </ProductNames>
                <BaseOeNr>43794-22000</BaseOeNr>
                <Pricing>
                    <ListPriceCurrency>USD</ListPriceCurrency>
                    <LocalCurrency>TLY</LocalCurrency>
                    <CurrencyRate>17.6599</CurrencyRate>
                    <ListPriceWoVAT>31.24</ListPriceWoVAT>
                    <LocalListPriceWVat>651.0004</LocalListPriceWVat>
                    <LocalListPriceWoVat>551.695251</LocalListPriceWoVat>
                    <LocalNetPriceWVat>377.580261</LocalNetPriceWVat>
                    <LocalNetPriceWoVat>319.983246</LocalNetPriceWoVat>
                    <Discount1>42</Discount1>
                    <Discount2>0</Discount2>
                    <Discount3>0</Discount3>
                    <Discount4>0</Discount4>
                    <Discount5>0</Discount5>
                    <Discount6>0</Discount6>
                    <InDiscount>false</InDiscount>
                </Pricing>
                <Stocks>
                    <Stock WarehouseID="1" Equality="Eq">0</Stock>
                    <Stock WarehouseID="7" Equality="Eq">0</Stock>
                    <Stock WarehouseID="4" Equality="Eq">0</Stock>
                    <Stock WarehouseID="2" Equality="Eq">0</Stock>
                    <Stock WarehouseID="5" Equality="Eq">0</Stock>
                </Stocks>
            </Product>
        </Products>
    </Result>
</ResultOfProductList>

XSLT

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="/ResultOfProductList">
        <Products>
            <xsl:for-each select="Result/Products/Product">
                <Product>
                    <ID>
                        <xsl:value-of select="@ID"/>
                    </ID>
                    <!--<BrandID>
                    <xsl:value-of select="@BrandID"/>
                    </BrandID>-->
                    <BrandName><xsl:value-of select="../../Brands/Brand/@BrandName"/></BrandName>
                    <BaseOeNr>
                        <xsl:value-of select="BaseOeNr"/>
                    </BaseOeNr>
                    <ProductCode>
                        <xsl:value-of select="@ProductCode"/>
                    </ProductCode>
                    <ProductName>
                        <xsl:value-of select="ProductNames/ProductName"/>
                    </ProductName>
                    <LocalCurrency>
                        <xsl:value-of select="Pricing/LocalCurrency"/>
                    </LocalCurrency>
                    <LocalNetPriceWVat>
                        <xsl:value-of select="Pricing/LocalNetPriceWVat"/>
                    </LocalNetPriceWVat>
                    <Stocks><xsl:value-of select="sum(Stocks/Stock)"/></Stocks>
                </Product>
            </xsl:for-each>
        </Products>
    </xsl:template>
</xsl:stylesheet>

Output XML

<Products>
  <Product>
    <ID>134898</ID>
    <BrandName>PARTSMALL-KORE</BrandName>
    <BaseOeNr>43794-22000</BaseOeNr>
    <ProductCode>KR-PML-PTA-086</ProductCode>
    <ProductName>VITES HALATI ( HYUNDAI : ACCENT 95-00 )</ProductName>
    <LocalCurrency>TLY</LocalCurrency>
    <LocalNetPriceWVat>377.580261</LocalNetPriceWVat>
    <Stocks>0</Stocks>
  </Product>
</Products>

c#

void Main()
{
   const string SOURCEXMLFILE = @"e:\Temp\input.xml";
   const string XSLTFILE = @"e:\Temp\process.xslt";
   const string OUTPUTXMLFILE = @"e:\temp\output.xml";

   try
   {
      XsltArgumentList xslArg = new XsltArgumentList();

      using (XmlReader src = XmlReader.Create(SOURCEXMLFILE))
      {
         XslCompiledTransform xslt = new XslCompiledTransform();
         xslt.Load(XSLTFILE, new XsltSettings(true, true), new XmlUrlResolver());

         XmlWriterSettings settings = xslt.OutputSettings.Clone();
         settings.IndentChars = "\t";
         // to remove BOM
         settings.Encoding = new UTF8Encoding(false);

         using (XmlWriter result = XmlWriter.Create(OUTPUTXMLFILE, settings))
         {
            xslt.Transform(src, xslArg, result, new XmlUrlResolver());
            result.Close();
         }
      }
      Console.WriteLine("File '{0}' has been generated.", OUTPUTXMLFILE);
   }
   catch (Exception ex)
   {
      Console.WriteLine(ex.Message);
   }
}
  • Related