C# XML转换求助:将Web服务XML转换为指定精简格式
XML格式转换解决方案(C#实现)
问题描述
我之前用PHP能完成XML格式转换,但数据量过大时耗时太长。现在用C#从Web服务读取XML后,无法转换成预期格式,寻求解决办法。
原始XML
<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>
预期输出XML
<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>
C#实现代码
使用System.Xml.Linq命名空间的XDocument高效处理XML,适合大数据量场景,代码如下:
using System; using System.Xml.Linq; using System.Linq; class Program { static void Main() { // 替换为从Web服务获取的XML字符串或文件路径 string originalXml = @"<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>"; XDocument doc = XDocument.Parse(originalXml); XElement newProducts = new XElement("Products"); foreach (var product in doc.Descendants("Product")) { XElement newProduct = new XElement("Product"); // 转换Product属性为子元素 newProduct.Add(new XElement("ID", product.Attribute("ID").Value)); newProduct.Add(new XElement("BrandID", product.Attribute("BrandID").Value)); newProduct.Add(new XElement("ProductCode", product.Attribute("ProductCode").Value)); // 添加BaseOeNr newProduct.Add(new XElement("BaseOeNr", product.Element("BaseOeNr").Value)); // 添加ProductName newProduct.Add(new XElement("ProductName", product.Descendants("ProductName").First().Value)); // 添加Pricing下的指定字段 var pricing = product.Element("Pricing"); newProduct.Add(new XElement("LocalCurrency", pricing.Element("LocalCurrency").Value)); newProduct.Add(new XElement("LocalNetPriceWVat", pricing.Element("LocalNetPriceWVat").Value)); // 拼接Stocks信息 var warehouseIds = product.Descendants("Stock") .Select(s => $"WarehouseID={s.Attribute("WarehouseID").Value}"); newProduct.Add(new XElement("Stocks", string.Join(" + ", warehouseIds))); newProducts.Add(newProduct); } // 输出或保存结果 Console.WriteLine(newProducts.ToString()); // newProducts.Save("output.xml"); } }
关键说明
- 采用
XDocument解析XML,查询节点效率高,适合处理大体积XML - 将原始Product节点的属性(ID、BrandID等)转为目标XML的子元素
- 提取并整理ProductName、BaseOeNr、Pricing下的指定字段
- 遍历Stock节点,拼接WarehouseID为指定格式的字符串
- 最终生成符合预期的XML结构,可直接输出或写入文件
内容的提问来源于stack exchange,提问作者Kenan Kocabas
相关产品推荐
相关产品推荐

