从DataSet控制XML序列化 - “TableName元素”上的属性

时间:2009-12-22 17:47:18

标签: xml-serialization dataset

希望我选择了正确的论坛。

我有一个数据集对象,其中有一个表来自常见的自定义组件的GetDS方法。我需要将XML传递给另一个进程(分块为字节数组)。我已经完成了所有工作,但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元素的属性。此节点是DataSet中DataTable的名称。

我已经搜索了如何控制XMLSerializer并找到许多自定义对象的示例。我甚至发现将列映射设置为MappingType.Attribute的示例很接近但我需要使用根元素来实现这一点,根元素实际上是数据集的TableName。

我觉得我很亲密,如果我找不到更优雅的解决方案,我将不得不创建一个像循环和吐出更改的字符串加上其余XML的黑客。

提前致谢(手指交叉)!

2 个答案:

答案 0 :(得分:0)

您可以将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();

答案 1 :(得分:0)

This看起来就像你在寻找的东西。