You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 16:24:32