C#.NET使用自定义架构从SQL数据集写入XML文件

时间:2010-12-01 12:51:37

标签: c# .net xml dataset schema

我在C#Visual Studio 2010中有以下代码。

string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Database\\db.mde";
string sql = "SELECT * FROM Customer";
OleDbConnection connection = new OleDbConnection(connectionString);
OleDbDataAdapter adapter = new OleDbDataAdapter(sql, connection);

DataSet ds = new DataSet();
connection.Open();
adapter.Fill(ds, "Test Table");
connection.Close();
dataGridView1.DataSource = ds;
dataGridView1.DataMember = "Test Table";
ds.WriteXml("C:\\Users\\Desktop\\testfile.XML");

现在它可以完成我想要的一切,但我需要在导出时稍微修改XML文件的格式。这可以轻松完成吗?我收集我需要提供一个很好的模式文件,但我不确定如何使用数据集实现它。

目前XML看起来像这样。

<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <Test_x0020_Table>
    <name>Customer1</name>
    <address>25 Big St</address>
    <suburb>Sydney NSW</suburb>
    <contact>Fred Nurk</contact>
    <phone>11 1111 1111</phone>
  </Test_x0020_Table>
</NewDataSet>

...但我希望它看起来像这样

<?xml version="1.0" standalone="yes"?>
<Customers>
    <name>Customer1</name>
    <address>25 Big St</address>
    <suburb>Sydney NSW</suburb>
    <contact>Fred Nurk</contact>
    <phone>11 1111 1111</phone>
</Customers>

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

第一个节点是表的名称。

您可以通过在数据集上设置名称来更改此设置。

DataSet ds = new DataSet(“ Customers ”); //复数


内部节点是记录。

您可以通过在填充适配器时指定名称来更改此项。

adapter.Fill(ds,“客户”); //奇异


这会给你一个结果:

 
<Customers>
  <Customer>
    <name>Customer1</name>
    <address>25 Big St</address>
    <suburb>Sydney NSW</suburb>
    <contact>Fred Nurk</contact>
    <phone>11 1111 1111</phone>
  </Customer>
</Customers> 

这意味着如果您返回多个结果,最终会得到:

 
<Customers>
  <Customer>
    <name>Customer1</name>
    <address>25 Big St</address>
    <suburb>Sydney NSW</suburb>
    <contact>Fred Nurk</contact>
    <phone>11 1111 1111</phone>
  </Customer>
  <Customer>
    <name>Customer1</name>
    <address>25 Big St</address>
    <suburb>Sydney NSW</suburb>
    <contact>Fred Nurk</contact>
    <phone>11 1111 1111</phone>
  </Customer>
  <Customer>
    <name>Customer1</name>
    <address>25 Big St</address>
    <suburb>Sydney NSW</suburb>
    <contact>Fred Nurk</contact>
    <phone>11 1111 1111</phone>
  </Customer>
</Customers> 

您不能拥有一个“客户”,因为当您编写XML时,它会将其格式化为“表格”并带有“记录”。

答案 1 :(得分:1)

这样的事情怎么样:

        using (MemoryStream ms = new MemoryStream())
        {
            ds.WriteXml(ms);
            XDocument doc = XDocument.Load(ms);

            // change XML using doc

            doc.Save("C:\\Users\\Desktop\\testfile.XML");                
        }

- 编辑 -

这是我创建的一个关于如何使用LINQ转换为XML的xml的小测试:

    private void XmlTest()
    {
        String xml = "<NewDataSet><Test_x0020_Table><name>Customer1</name><address>25 Big St</address><suburb>Sydney NSW</suburb><contact>Fred Nurk</contact><phone>11 1111 1111</phone></Test_x0020_Table></NewDataSet>";

        XDocument doc = XDocument.Parse(xml);
        XElement element = doc.Descendants("Test_x0020_Table").First();
        XElement newElement = new XElement("Customers", element.Descendants());

        MessageBox.Show(newElement.ToString());
    }

使用上面的代码来操作xml并使用doc.Save()方法保存它。

答案 2 :(得分:1)

假设您的XML始终具有类似于

的结构
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <Test_x0020_Table>
    <name>Customer1</name>
    <address>25 Big St</address>
    <suburb>Sydney NSW</suburb>
    <contact>Fred Nurk</contact>
    <phone>11 1111 1111</phone>
  </Test_x0020_Table>
</NewDataSet>

您可以这样做:

string XMLPath = "C:\\Users\\Desktop\\testfile.XML";

XDocument XMLPreModification = new XDocument.Load(XMLPath);
XDocument XMLModified = new XDocument;

XMLDoified.Add(New XElement("Customers", XMLPreModification.Descendants.Descendants()));

XMLModified.Save(XMLPath);

这只是制作一个新的XDocument,添加一个Customer元素并将所需的节点插入该元素,然后将其保存到文件中。