【问题标题】:DataSet.WriteXml() - how to "drop" some fieldsDataSet.WriteXml() - 如何“删除”一些字段
【发布时间】:2011-09-13 11:14:02
【问题描述】:

我有 2 个问题:

首先,我有一个包含 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,如上所示。我想向&lt;o&gt; 节点添加一些属性,例如当前日期时间。我的意思是我希望将&lt;o&gt; 节点生成为&lt;o generatedDate="09/13/2011" generatedTime="03:45 PM"&gt;。我怎样才能实现它?

谢谢,

【问题讨论】:

    标签: asp.net xml datatable dataset


    【解决方案1】:

    您可以隐藏该列以将其从 XML 文件中排除:

    dataSet.Tables["TableName"].Columns["ColumnName"].ColumnMapping = MappingType.Hidden;
    

    【讨论】:

      【解决方案2】:

      一种选择是使用 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,序列化为 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>
      

      【讨论】:

      • 哪个更好?你建议什么?您能否提供一些示例链接?
      【解决方案3】:

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

      【讨论】:

      • 是否有“过滤掉”XDocument 的示例?例如,选择完全相同的结构,但不包括层次结构中的一些子 XElement?可以说我可以按照this 之类的方法删除节点。
      猜你喜欢
      • 2018-05-07
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      • 2021-09-06
      • 2020-03-28
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      相关资源
      最近更新 更多