【问题标题】:Control XML Serialization from DataSet -- Attributes on "TableName element"从 DataSet 控制 XML 序列化——“TableName 元素”上的属性
【发布时间】:2010-12-29 05:09:51
【问题描述】:

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

我有一个数据集对象,其中一个表来自一个通用自定义组件的 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。

我觉得我已经很接近了,如果我找不到更优雅的解决方案,我将不得不创建一个 hack,比如循环和吐出更改的字符串以及 XML 的其余部分。

提前致谢(祈祷)!

【问题讨论】:

    标签: xml-serialization dataset


    【解决方案1】:

    This 看起来很像您要找的东西。

    【讨论】:

    • 谢谢 uli78。看起来 ExtendedProperties 确实会序列化为属性,但看起来它只适用于表列 - 不适用于表本身。请注意 FooUpload 元素上的属性。该节点是DataSet 中DataTable 的名称。似乎DataSet序列化时,根元素是表名。 DataSet中的表是否有属性之类的东西?
    • 是的,有。 ".ExtendedProperties"
    【解决方案2】:

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

    【讨论】:

    • 我认为这可能确实是唯一的方法。我发现一些迹象表明 DataSet 序列化不处理混合类型是“设计使然”。
    • @sdmcnitt:那么请给我的答案投票。如果你认为你会使用它,请接受它。
    • 我需要一个“15 声望”来投票它说。我想我是臭名昭著的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多