我有两个问题:
首先,我有一个包含5个表的数据集。我已经建立了表的关系并从这个数据集生成XML,如下所示:
StreamWriter xmlDoc = new StreamWriter("myxml.xml", false);
ds.WriteXml(xmlDoc);
xmlDoc.Close();
数据集中每个表中的某些字段是主键,我不希望以XML格式显示它们。如果我将它们从表格中排除,我就无法建立关系。任何人都可以给我一些想法,如何将数据集写入XML“丢弃”关键字段(数据表中的列)?例如,这里是生成的XML:
<?xml version="1.0"?>
<o>
<sp spname="SP1" spid="8">
<event spid="8" eventname="Event1" eventId="482">
<bm bmname="BM1" bmid="2" bmeid="826" eventid="482">
<att bmeid="826" val="3.00" attname="Att1" atttype="Type1" attid="23172"/>
<att bmeid="826" val="3.50" attname="Att2" bettype="Type1" attid="23173"/>
</bm>
</event>
</sp>
</o>
但我希望这样生成这样的XML(所有id属性都应该“删除”,因为所有id都是用于关系的,不应该用XML添加):
<?xml version="1.0"?>
<o>
<sp spname="SP1">
<event eventname="Event1">
<bm bmname="BM1" bmid="2">
<att val="3.00" attname="Att1" atttype="Type1" />
<att val="3.50" attname="Att2" bettype="Type1" />
</bm>
</event>
</sp>
</o>
现在第二个问题:
我已将数据集的名称命名为“o”,因此可以生成xml,如上所示。我想向<o>
节点添加一些属性,如当前日期时间。我的意思是我希望将<o>
节点生成为<o generatedDate="09/13/2011" generatedTime="03:45 PM">
。我怎样才能实现它?
谢谢,
答案 0 :(得分:2)
您可以隐藏列以将其从XML文件中排除:
dataSet.Tables["TableName"].Columns["ColumnName"].ColumnMapping = MappingType.Hidden;
答案 1 :(得分:1)
我建议在生成XML之后,使用LINQ to XML过滤/添加属性到所需的节点。这个过滤和添加属性是一个单独的步骤,然后从数据集生成XML,应该在从数据集生成XML之后处理,因为这将导致更好的设计。
答案 2 :(得分:1)
一种选择是使用LINQ to XML来改变文档。另一种选择是将XML传递给XSLT转换器,该转换器可以解析XML并输出所需的结果。
使用XSLT转换数据集:
DataTable table = new DataTable();
System.IO.StringWriter writer = new System.IO.StringWriter();
//notice that we're ignoring the schema so we get clean XML back
//you can change the write mode as needed to get your result
table.WriteXml(writer, XmlWriteMode.IgnoreSchema, false);
string dataTableXml = writer.ToString();
至于以可读格式显示它,我建议将XML传递给XSL转换器,然后您可以使用它来解析XML并根据需要操作输出。
将XSLT转换应用于数据集
http://msdn.microsoft.com/en-us/library/8fd7xytc%28v=vs.71%29.aspx#Y289
这是我创建的一个简单示例,用于解释如何使用XSL转换器。我没有测试过,但它应该非常接近:
DataSet ds = new DataSet();
StringBuilder sbXslOutput = new StringBuilder();
using (XmlWriter xslWriter = XmlWriter.Create(sbXslOutput))
{
XslCompiledTransform transformer = new XslCompiledTransform();
transformer.Load("transformer.xsl");
XsltArgumentList args = new XsltArgumentList();
transformer.Transform(new XmlDataDocument(ds), args, xslWriter);
}
string dataSetHtml = sbXslOutput.ToString();
使用XSLT将XML格式化为HTML
这是使用XSLT将XML转换为HTML表的示例。它应该相当容易采用,因此您可以将它与序列化的DataSet一起使用。
假设这是您的DataSet,序列化为XML:
<RecentMatter>
<UserLogin>PSLTP6\RJK</UserLogin>
<MatterNumber>99999-2302</MatterNumber>
<ClientName>Test Matters</ClientName>
<MatterName>DP Test Matter</MatterName>
<ClientCode>99999</ClientCode>
<OfficeCode/>
<OfficeName/>
<Billable>true</Billable>
<ReferenceId/>
<LastUsed>2011-08-23T23:40:24.13+01:00</LastUsed>
</RecentMatter>
<RecentMatter>
<UserLogin>PSLTP6\RJK</UserLogin>
<MatterNumber>999991.0002</MatterNumber>
<ClientName>Lathe 1</ClientName>
<MatterName>LW Test 2</MatterName>
<ClientCode/>
<OfficeCode/>
<OfficeName/>
<Billable>true</Billable>
<ReferenceId/>
<LastUsed>2011-07-12T16:57:27.173+01:00</LastUsed>
</RecentMatter>
<RecentMatter>
<UserLogin>PSLTP6\RJK</UserLogin>
<MatterNumber>999991-0001</MatterNumber>
<ClientName>Lathe 1</ClientName>
<MatterName>LW Test 1</MatterName>
<ClientCode/>
<OfficeCode/>
<OfficeName/>
<Billable>false</Billable>
<ReferenceId/>
<LastUsed>2011-07-12T01:59:06.887+01:00</LastUsed>
</RecentMatter>
</NewDataSet>
这是一个将DataSet转换为HTML的XSLT脚本:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<table border="1">
<tr>
<th>User Login</th>
<th>Matter Number</th>
...
</tr>
<xsl:for-each select="NewDataSet/RecentMatter">
<tr>
<td>
<xsl:value-of select="UserLogin"/>
</td>
<td>
<xsl:value-of select="MatterNumber"/>
</td>
...
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>