首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataSet.WriteXml() -如何“删除”某些字段

DataSet.WriteXml() -如何“删除”某些字段
EN

Stack Overflow用户
提问于 2011-09-13 19:14:03
回答 3查看 2.4K关注 0票数 0

我有两个问题:

首先,我有一个包含5个表的数据集。我创建了表之间的关系,并从该数据集生成XML,如下所示:

代码语言:javascript
复制
StreamWriter xmlDoc = new StreamWriter("myxml.xml", false);
ds.WriteXml(xmlDoc);
xmlDoc.Close();

dataset中每个表中的某些字段是主键,我不想在XML中显示它们。如果我将它们从表中排除,我就不能建立关系。谁能告诉我如何将dataset写成XML“丢弃”关键字段(数据表中的列)?例如,下面是目前生成的XML:

代码语言:javascript
复制
<?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中):

代码语言:javascript
复制
<?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>节点添加一些属性,比如current datetime。我的意思是,我希望将<o>节点命名为<o generatedDate="09/13/2011" generatedTime="03:45 PM">。我怎样才能做到这一点?

谢谢,

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-13 19:17:26

我建议在生成XML之后,使用LINQ to XML来过滤/添加所需节点的属性。过滤和添加属性是一个单独的步骤,然后从数据集生成XML,应该在从数据集生成XML之后处理,因为这将导致更好的设计。

票数 1
EN

Stack Overflow用户

发布于 2013-10-09 10:43:22

您可以隐藏该列以将其从XML-File中排除:

代码语言:javascript
复制
dataSet.Tables["TableName"].Columns["ColumnName"].ColumnMapping = MappingType.Hidden;
票数 3
EN

Stack Overflow用户

发布于 2011-09-13 22:41:18

一种选择是使用LINQ to XML来更改文档。另一种选择是将XML传递给XSLT转换器,后者可以解析XML并输出所需的结果。

使用XSLT转换DataSet的

代码语言:javascript
复制
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转换应用于DataSet

http://msdn.microsoft.com/en-us/library/8fd7xytc%28v=vs.71%29.aspx#Y289

下面是我创建的一个简单示例,用于解释如何使用XSL转换器。我还没有测试过它,但它应该非常接近:

代码语言:javascript
复制
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将格式化为HTML

下面是使用XSLT将XML转换为HTML表的示例。它应该相当容易采用,这样您就可以在序列化的DataSet中使用它。

假设这是您的DataSet,序列化为XML:

代码语言:javascript
复制
<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脚本:

代码语言:javascript
复制
<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>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7400925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档