【发布时间】:2014-06-16 20:20:03
【问题描述】:
我将一个简单的 DataTable 序列化为 XML,并将结果存储在一个字符串中。使用 StringWriter 和 DataTable.WriteToXml,一切正常。
public class Parameters
{ private DataTable ParamList = new DataTable();
public Parameters()
{ //Default constructor, build datatable with two empty columns
ParamList.TableName = "Parameter";
ParamList.Columns.Add("Name",Type.GetType("System.String"));
ParamList.Columns.Add("Value",Type.GetType("System.Object")); }
...
public string ConvertToXML()
{ string result;
using(var sw = new System.IO.StringWriter())
{ ParamList.WriteXml(sw);
result = sw.ToString();
}
return result;
}
}
这如宣传的那样工作。但是,在定义字段时,XML 非常冗长:
<DocumentElement>
<Parameter>
<Name>ClientNumber</Name>
<Value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">00001</Value>
</Parameter>
<Parameter>
<Name>FirstName</Name>
<Value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">John</Value>
</Parameter>
<Parameter>
<Name>LastName</Name>
<Value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Smith</Value>
</Parameter>
...
我想消除 VALUE 字段中的所有命名空间和数据类型声明,就像出现 NAME 字段一样。我玩弄了 XmlWriterSettings(),但似乎找不到任何设置来完成此操作。有什么想法吗?我的建议可行吗?
(注 1:我的意图只是将数据表中的字段和值记录到 SQL 表中,并且由于字段和值的数量可能会有所不同,这似乎是最简单的方法。不会读取 XML回到过去,因此强类型数据元素对我的目标并不重要。)
(注 2:我想在不借助 RegEx 的情况下实现这一目标,但如果这是我唯一的选择,那可能是我采取的方向。)
对此进行了调查,但无法调整语法以使用 DataTable。
【问题讨论】:
-
你为什么关心它有多冗长?
-
输出是供人使用的,我只是使用 XML 格式作为一种方便的方式来保持它的组织。
-
DataTable 为您提供手动生成最简单的 xml 文档所需的所有元数据。只需遍历行和列,将结果输出到 stringbuilder 或使用其中一个 xml api。
-
听起来可以管理。我只是希望有一种内置的方法,利用 WriteXML() 函数而不是编写自定义解决方案。
-
刚刚运行测试并确认生成命名空间声明的唯一原因是因为我将数据表的 VALUE 字段定义为对象,因此它可以接受任何数据类型。如果我把它改成字符串,我的问题就解决了,但它对我的程序的其余部分没有好处。