2011-09-13 65 views
0

我有2個問題:DataSet.WriteXml() - 如何 「降」 某些領域

首先,我有一個數據集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> 

,但我想是這樣的(所有的id屬性應該被「丟棄」,因爲所有的IDS都是關係,不應當被添加產生該XML 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> 

現在第二個問題:

我給的名字我的數據集爲「○」,所以它的生成XML,你可以在上面看到。我想向當前日期時間的<o>節點添加一些屬性。我的意思是我想要<o>節點生成爲<o generatedDate="09/13/2011" generatedTime="03:45 PM">。我怎樣才能實現它?

謝謝,

回答

1

我建議生成XML後,使用LINQ XML濾除/添加屬性到期望的節點。這個過濾和添加屬性是一個單獨的步驟,然後從數據集生成XML,並且應該在從數據集生成XML之後處理,因爲這會導致更好的設計。

+0

是否有任何「過濾」的XDocument的例子?例如,選擇完全相同的結構,但排除層次結構中的某些子XElements?可以說我可以按照[this](http://stackoverflow.com/questions/4500554/xdocument-removing-nodes)的方式去除節點。 – PeterX

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轉換到DataSet

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

下面是使用XSLT將XML轉換爲HTML表的一個例子格式化XML作爲HTML。它應該相當容易採用,所以你可以在你的序列化數據集中使用它。

比方說,這是你的數據集,序列化到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> 

這裏是一個XSLT腳本轉換數據集到HTML:

<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> 
+0

哪一個更好?你有什麼建議?你能否提供一些例子的鏈接? –

2

您可以隱藏列從排除XML文件:

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