C # .NET Запись XML-файла из набора данных SQL с пользовательской схемой - PullRequest
1 голос
/ 01 декабря 2010

У меня есть следующий код в 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 ]

2 голосов
/ 09 декабря 2010

Первый узел - это имя вашей таблицы.

Вы можете изменить это, установив имя в вашем DataSet.

DataSet ds = новый DataSet (" Клиенты "); // множественное число


Внутренний узел - это запись.

Вы можете изменить это, указав имя при заполнении адаптера.

адаптер. Заполните (ds, " Customer "); // сингулярным


Это даст вам результат как:

 
<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 голос
/ 01 декабря 2010

Предполагая, что ваш 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Элемент и вставьте необходимые узлы в этот элемент, затем сохраните его в файл.

1 голос
/ 01 декабря 2010

Как насчет этого:

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

            // change XML using doc

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

- изменить -

Вот небольшой тест, который я создал для того, как вы можете преобразовать свой XML с помощью LINQ to 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().

...