DataSet.WriteXml () - как «отбросить» некоторые поля - PullRequest
0 голосов
/ 13 сентября 2011

У меня 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 должны быть «отброшены», поскольку все идентификаторы предназначены для отношений и не должны добавляться в 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">. Как мне этого добиться?

Спасибо

Ответы [ 3 ]

2 голосов
/ 09 октября 2013

Вы можете скрыть столбец, чтобы исключить его из XML-файла:

dataSet.Tables["TableName"].Columns["ColumnName"].ColumnMapping = MappingType.Hidden;
1 голос
/ 13 сентября 2011

Один из вариантов - использовать 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();

Форматирование XML как HTML с использованием XSLT

Вот пример использования XSLTпреобразовать 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, который преобразуетDataSet to 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>
1 голос
/ 13 сентября 2011

Я бы посоветовал после генерации XML использовать LINQ to XML, чтобы отфильтровать / добавить атрибут к нужным узлам. Этот атрибут фильтрации и добавления является отдельным этапом, после которого генерируется XML из набора данных, и его следует обрабатывать после того, как XML создается из набора данных, поскольку это приведет к улучшению дизайна.

...