簡體   English   中英

將數據集轉換為xml字符串,嵌套重復的xml反之亦然

[英]Convert dataset to xml string with nested repeated xml vice versa

我正在嘗試將具有2個數據表的數據集轉換為具有嵌套重復xml的xml字符串,如以下示例所示。

有什么建議嗎?

例:

<Items>
  <Code>A001</Code>
  <Qty>3</Qty>
  <SerialNoList>
    <SerialNo>S01</SerialNo>
    <SerialNo>S02</SerialNo>    
    <SerialNo>S03</SerialNo>
  </SerialNoList>
</Items>

我曾嘗試使用DataRelation將數據集轉換為xml,但只能獲得以下格式。

<Items>
  <Code>A001</Code>
  <Qty>3</Qty>
  <SerialNoList>
    <SerialNo>S01</SerialNo>
  </SerialNoList>
  <SerialNoList>
    <SerialNo>S02</SerialNo>    
  </SerialNoList>
  <SerialNoList>
    <SerialNo>S03</SerialNo>
  </SerialNoList>
</Items>

碼:

    data.Tables[0].TableName = "Items";
    data.Tables[1].TableName = "SerialNoList";

    DataRelation dataRelation = data.Relations.Add("SerialNo", 
    data.Tables[0].Columns["Code"], data.Tables[1].Columns["Code"]);

    dataRelation.Nested = true;
    data.Tables[1].Columns["Code"].ColumnMapping = MappingType.Hidden;

    string xmlString = data.GetXml();

資料:

1st DataTable (Items)
Code     Qty
A001     3

2nd DataTable (SerialNoList)
Code     SerialNo
A001     S01
A001     S02
A001     S03

嘗試使用Xml Linq進行以下操作:

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

namespace ConsoleApplication106
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            DataSet ds = new DataSet("Code_Serial_No");
            DataTable dtCode = new DataTable("Code");
            ds.Tables.Add(dtCode);

            dtCode.Columns.Add("Code", typeof(string));
            dtCode.Columns.Add("Qty", typeof(int));

            dtCode.Rows.Add(new object[] { "A001", 3});

            DataTable dtSerialNo = new DataTable("Serial_No");
            ds.Tables.Add(dtSerialNo);

            dtSerialNo.Columns.Add("Code", typeof(string));
            dtSerialNo.Columns.Add("SerialNo", typeof(string));

            dtSerialNo.Rows.Add(new object[] { "A001", "S01" });
            dtSerialNo.Rows.Add(new object[] { "A001", "S02" });
            dtSerialNo.Rows.Add(new object[] { "A001", "S03" });

            string xml = "<Items></Items>";
            XDocument doc = XDocument.Parse(xml);
            XElement items = doc.Root;

            items.Add(new XElement("Code", ds.Tables["Code"].Rows[0]["Code"]));
            items.Add(new XElement("Qty", ds.Tables["Code"].Rows[0]["Qty"]));

            XElement list = new XElement("SerialNoList");
            items.Add(list);

            foreach (DataRow row in ds.Tables["Serial_No"].AsEnumerable())
            {
                list.Add(new XElement("SerialNo", row.Field<string>("SerialNo")));
            }

            doc.Save(FILENAME);


        }

    }
}

對於那些需要處理多個項目的人

    //dataSet is filled with data
    string xml = "";
    foreach (DataRow dr in dataSet.Tables["Items"].Rows)
    {
        XDocument doc = XDocument.Parse("<Detail></Detail>");
        XElement items = doc.Root;

        items.Add(new XElement("Code", dr["Code"]));
        items.Add(new XElement("Qty", dr["Qty"]));

        XElement list = new XElement("SerialNoList");
        items.Add(list);

        foreach (DataRow row in data.Tables["SerialNoList"].Select("Code = '" + dr["Code"] + "'"))
        {
            list.Add(new XElement("SerialNo", row["SerialNo"]));
        }

        xml += doc.ToString();
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM