无法返回XML格式的字符串,使用C#中的stringbuilder和DB模板,对于PlaceHolder

时间:2016-11-17 19:53:15

标签: c# xml stringbuilder

下午好,

我有一个函数,可以在我的DB中为模板构建一个输出XML结构的字符串。它将Order类作为参数和模板,我很难尝试填充名为[[items]]的占位符标记,其中根据表中项目的数量,它应该为该部分构建xml列表。

这是模板,它只返回字符串的一个实例,但它应该根据表中的内容返回(n)个实例。

<Items>
   [[items]]
</Items>

这是应该为项目的其他标签填充的内容

<Item>
 <SKU>[[item_sku]]</SKU>
 <PROD_NAME><![CDATA[[[item_product_name]]]]></PROD_NAME>
 <Description><![CDATA[[[item_name]]]]></Description>
 <Attributes><![CDATA[[[item_attributes]]]]></Attributes>
 <Quantity>[[item_qty]]</Quantity>
 <UnitPrice>[[item_price]]</UnitPrice>
 <InkColor>[[item_inkcolor]]</InkColor>
</Item>

它想要像这样填充

<Items>
  <Item>
    <SKU>7Z-BRPA-K79A</SKU>
    <PROD_NAME><![CDATA[Test One]]></PROD_NAME>
    <Description><![CDATA[ExcelMark 5-Line Large Return Address Stamp - Custom Self Inking Rubber Stamp]]></Description>
    <Attributes><![CDATA[Custom Text Line 1 Text: This book was donated to CAEO Font: Arial
                Custom Text Line 2 Text: In tribute to & memory of Font: Arial]]></Attributes>
    <Quantity>1</Quantity>
    <UnitPrice><![CDATA[$9.99]]></UnitPrice>
    <InkColor>Red</InkColor>
  </Item>
  <Item>
    <SKU>42A1848</SKU>
    <PROD_NAME><![CDATA[Test Two]]></PROD_NAME>
    <Description><![CDATA[Self Inking Rubber Stamp with up To 4 Lines of Custom Text]]></Description>
    <Attributes><![CDATA[Custom Text Line 1 Text: This book was donated to CAEO Font: Arial
                Custom Text Line 2 Text: In tribute to & memory of Font: Arial]]></Attributes>
    <Quantity>1</Quantity>
    <UnitPrice><![CDATA[$8.99]]></UnitPrice>
    <InkColor>Blue</InkColor>
  </Item>
</Items>

这是实现它的功能

public string PopulateStringBuilder(Order order, Template template)
    {
        var i = new StringBuilder(template.Description);
        List<string> s = new List<string>();
        var reqID = order.OrderId;

            foreach (var x in order.Items)
            {
                i.Replace("[[item_sku]]", x.SkuNumber);
                i.Replace("[[item_product_name]]", x.ProductName);
                i.Replace("[[item_name]]", x.Description);
                i.Replace("[[item_attributes]]", x.Attributes);
                i.Replace("[[item_qty]]", x.Quantity.ToString());
                i.Replace("[[item_price]]", x.UnitPrice.ToString());
                i.Replace("[[item_inkcolor]]", x.InkColor);
                o.Replace("[[items]]", i.ToString());
            }  
        return o.ToString();
    }

1 个答案:

答案 0 :(得分:1)

尝试正确的方式

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Item> items = new List<Item>() {
                new Item() {
                    SKU = "7Z-BRPA-K79A",
                    PROD_NAME = "Test One",
                    Description = "ExcelMark 5-Line Large Return Address Stamp - Custom Self Inking Rubber Stamp",
                    Attributes = "Custom Text Line 1 Text: This book was donated to CAEO Font: Arial" +
                            " Custom Text Line 2 Text: In tribute to & memory of Font: Arial",
                    Quantity = 1,
                    UnitPrice =  "$9.99",
                    InkColor = "Red"
                },
                new Item() {
                    SKU = "42A1848",
                    PROD_NAME = "Test Two",
                    Description = "Self Inking Rubber Stamp with up To 4 Lines of Custom Text",
                    Attributes = "Custom Text Line 1 Text: This book was donated to CAEO Font: Arial" +
                           " Custom Text Line 2 Text: In tribute to & memory of Font: Arial",
                    Quantity = 1,
                    UnitPrice = "$8.99",
                    InkColor = "Blue"
                }
            };
            XElement xItems = new XElement("Items");

            foreach (Item item in items)
            {
                XElement xItem = new XElement("Item", new object[] {
                    new XElement("SKU", item.SKU),
                    new XElement("PROD_NAME",  new XCData(item.PROD_NAME)),
                    new XElement("Description", new XCData(item.Description)),
                    new XElement("Attribute", new XCData(item.Attributes)),
                    new XElement("Quantity", item.Quantity),
                    new XElement("UnitPrice", new XCData(item.UnitPrice)),
                    new XElement("InkColor", item.InkColor)
                });
                xItems.Add(xItem);
            }
        }
    }
    public class Item
    {
        public string SKU { get; set; }
        public string PROD_NAME { get; set; }
        public string Description { get; set; }
        public string Attributes { get; set; }
        public int Quantity { get; set; }
        public string UnitPrice { get; set; }
        public string InkColor { get; set; }
    }
}


//<Items>
//  <Item>
//    <SKU>7Z-BRPA-K79A</SKU>
//    <PROD_NAME><![CDATA[Test One]]></PROD_NAME>
//    <Description><![CDATA[ExcelMark 5-Line Large Return Address Stamp - Custom Self Inking Rubber Stamp]]></Description>
//    <Attributes><![CDATA[Custom Text Line 1 Text: This book was donated to CAEO Font: Arial
//                Custom Text Line 2 Text: In tribute to & memory of Font: Arial]]></Attributes>
//    <Quantity>1</Quantity>
//    <UnitPrice><![CDATA[$9.99]]></UnitPrice>
//    <InkColor>Red</InkColor>
//  </Item>
//  <Item>
//    <SKU>42A1848</SKU>
//    <PROD_NAME><![CDATA[Test Two]]></PROD_NAME>
//    <Description><![CDATA[Self Inking Rubber Stamp with up To 4 Lines of Custom Text]]></Description>
//    <Attributes><![CDATA[Custom Text Line 1 Text: This book was donated to CAEO Font: Arial
//                Custom Text Line 2 Text: In tribute to & memory of Font: Arial]]></Attributes>
//    <Quantity>1</Quantity>
//    <UnitPrice><![CDATA[$8.99]]></UnitPrice>
//    <InkColor>Blue</InkColor>
//  </Item>
//</Items>