Управлять сериализацией XML из DataSet - атрибуты «элемента TableName» - PullRequest
3 голосов
/ 22 декабря 2009

Надеюсь, я выбрал правильный форум.

У меня есть объект набора данных с одной таблицей, который пришел ко мне из метода GetDS общего пользовательского компонента. Мне нужно передать XML другому процессу (chunked как байтовый массив). У меня все это работает, но в XML отсутствуют некоторые атрибуты, которых ожидает процесс потребления.

Я создаю объект набора данных и могу управлять именем TableName (корневой элемент) и строкой так:

da.Fill(ds, "Foo")
ds.DataSetName = "FooUpload"

Я использую метод GetXML для сериализации в XML, который выглядит следующим образом:

<?xml version="1.0" standalone="yes" ?> 
<FooUpload>
  <Foo>
  <FooMasterID>483</FooMasterID> 
  <Country>27</Country> 
  <PaymentCode>ANN</PaymentCode> 
  <Amount>132</Amount> 
  <PaidDate>2012-12-31 00:00:00</PaidDate> 
  <PaidBy>FooServices</PaidBy> 
  </Foo>
</FooUpload>

Процесс вызова ожидает

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
<FooUpload **ClientCode="FOOO" RecordCount="1" CreateDate="2008-12-09T15:02:18.920" CreateUser="valli"**>
  <Foo>
  <FooMasterID>483</FooMasterID> 
  <Country>27</Country> 
  <PaymentCode>ANN</PaymentCode> 
  <Amount>132</Amount> 
  <PaidDate>2012-12-31 00:00:00</PaidDate> 
  <PaidBy>FooServices</PaidBy> 
  </Foo>
</FooUpload>

Обратите внимание на атрибуты элемента FooUpload. Этот узел является именем DataTable в DataSet.

Я искал способ управления XMLSerializer и нашел множество примеров для пользовательских объектов. Я даже нашел примеры установки сопоставления столбцов MappingType.Attribute, который близок, но мне нужно сделать это с корневым элементом, который на самом деле является TableName для набора данных.

Я чувствую, что я близко, и если я не найду более элегантного решения, мне придется создать хак, такой как зацикливание и выплевывание измененной строки плюс остальная часть XML.

Заранее спасибо (скрестив пальцы)!

Ответы [ 2 ]

0 голосов
/ 08 января 2010

Это выглядит в значительной степени как то, что вы ищете.

0 голосов
/ 22 декабря 2009

Вы можете передать вывод GetXML в XmlDocument и добавить атрибуты впоследствии. Например:

 XmlDocument xdoc = new XmlDocument();
 xdoc.LoadXml(ds.GetXml());
 XmlAttribute attr=xdoc.CreateAttribute("ClientCode");
 attr.Value = "FOOOO";
 xdoc.DocumentElement.Attributes.Append(attr);

Затем вы можете сохранить xdoc в файл или поместить его в строку, например:

 XmlTextWriter xw = new XmlTextWriter(new MemoryStream(),Encoding.UTF8);
 xdoc.Save(xw);
 xw.BaseStream.Position = 0;
 StreamReader sr = new StreamReader(xw.BaseStream);
 string result = sr.ReadToEnd();
...