2012-01-18 40 views
0

我在C#的ASP.net应用程序,其中我有一个数据集,我可以通过使用下面的简单代码块转移到XML生成XML如下:从动态数据集

<NewDataSet> 
<ImageInfo> 
<ImageID>1</ImageID> 
<ImageName>untitled.bmp</ImageName> 
<ImagePath>Some Path</ImagePath> 
<Width>800</Width> 
<Height>190</Height> 
<TileSize>256</TileSize> 
<Overlap>1</Overlap> 
<MimeType>image/jpeg</MimeType> 
<Scale /> 
</ImageInfo> 
</NewDataSet> 

这显然是一行的例子,数据集中有多行。现在,我不知道如何动态地格式化XML块。 任何人都可以点我一些很好的教程呢? 我想的XML进行格式化像下面

<data> 
<Columns> 
<Column Name= "ImageID"/> 
<Column Name= "ImageName"/> 
<Column Name= "ImagePath"/> 
<Column Name= "Width"/> 
<Column Name= "Height"/> 
<Column Name= "TileSize"/> 
<Column Name= "Overlap"/> 
<Column Name= "MimeType"/> 
<Column Name= "Scale"/> 
</Columns> 
<Rows> 
<Row> 
<Cell>1</Cell> 
<Cell>untitled.bmp</Cell> 
<Cell>Some Path</Cell> 
<Cell>800</Cell> 
<Cell>190</Cell> 
<Cell>256</Cell> 
<Cell>1</Cell> 
<Cell>image/jpeg</Cell> 
<Cell></Cell> 
</Row> 
<Row> 
. 
. 
. 
</Row> 
</Rows> 
</data> 

任何人都可以指导我如何做到这一点?

在我的应用程序中,我不会事先知道数据集的结构。即可以有一个结果数据集,其中列的数量多于示例中所述的数据集。我应该怎么做呢?任何帮助将非常感激。

回答

0

尝试使用DataTable,然后将该DataTable转换为XML流或文件。

DataTable myDataTable = myDataSet.Tables[0]; 


myDataTable.WriteXml(..); 

你会发现像TextWriter,Stream等一大堆重载。最后,您需要修改该XML以添加该DataTable以外的节点。

+0

感谢您的回复。但这不是我所要求的。我提到我可以从数据集中获得第一个xml块。我想知道,就像你说的那样,如何修改该xml以添加节点,使其看起来像问题中的第二个xml块。再次感谢。 – nilarya

0

这可以是一个工作。代码标准可以更好,但现在您可以使用以下内容:

XmlDocument doc = new XmlDocument(); 
     XmlDocument Outputdoc = new XmlDocument(); 
     doc.LoadXml("<NewDataSet> <ImageInfo> <ImageID>1</ImageID> <ImageName>untitled.bmp</ImageName> <ImagePath>Some Path</ImagePath> <Width>800</Width> <Height>190</Height> <TileSize>256</TileSize> <Overlap>1</Overlap> <MimeType>image/jpeg</MimeType> <Scale /> <ImageID>1</ImageID> <ImageName>untitled.bmp</ImageName> <ImagePath>Some Path</ImagePath> <Width>800</Width> <Height>190</Height> <TileSize>256</TileSize> <Overlap>1</Overlap> <MimeType>image/jpeg</MimeType> <Scale /></ImageInfo> </NewDataSet> "); 
     XmlNode node = doc.SelectSingleNode("/NewDataSet/ImageInfo"); 
     XmlNodeList nodes = node.ChildNodes; 
     XmlDocument newdoc = null; 
     StringBuilder sb = new StringBuilder("<data><Columns>"); 
     string lastNode=string.Empty; 
     string firstNode = string.Empty; 
     foreach (XmlNode n in node.ChildNodes) 
     { 
      if(n.Name.Equals(firstNode)) 
       break; 
      if (string.IsNullOrEmpty(firstNode)) 
       firstNode = n.Name; 

      newdoc = new XmlDocument(); 
      XmlNode newNode = newdoc.CreateElement("Column"); 
      XmlAttribute newAttribute = newdoc.CreateAttribute("Name"); 
      newAttribute.Value = n.Name; 
      newNode.Attributes.Append(newAttribute); 
      newdoc.AppendChild(newNode); 
      sb.Append(newdoc.InnerXml); 
      lastNode=n.Name; 
     } 
     sb.Append("</Columns><Rows><Row>"); 
     foreach (XmlNode xnode in node.ChildNodes) 
     { 
      XmlDocument newdoc1 = new XmlDocument(); 
      XmlNode newNode = newdoc1.CreateElement("Cell"); 
      newNode.InnerText = xnode.InnerText; 
      newdoc1.AppendChild(newNode); 
      sb.Append(newdoc1.InnerXml); 
      if (xnode.Name.Equals(lastNode)) 
       sb.Append("</Row>"); 
     } 
     sb.Append("</Rows></data>"); 

这是一个非常快速的方式来完成您的任务。您可以自由地对代码进行标准化。现在看看你需要的输出:

<data> 
<Columns> 
    <Column Name="ImageID" /> 
    <Column Name="ImageName" /> 
    <Column Name="ImagePath" /> 
    <Column Name="Width" /> 
    <Column Name="Height" /> 
    <Column Name="TileSize" /> 
    <Column Name="Overlap" /> 
    <Column Name="MimeType" /> 
    <Column Name="Scale" /> 
</Columns> 
<Rows> 
    <Row> 
     <Cell>1</Cell> 
     <Cell>untitled.bmp</Cell> 
     <Cell>SomePath</Cell> 
     <Cell>800</Cell> 
     <Cell>190</Cell> 
     <Cell>256</Cell> 
     <Cell>1</Cell> 
     <Cell>image/jpeg</Cell> 
     <Cell></Cell> 
    </Row> 
     <Cell>1</Cell> 
     <Cell>untitled.bmp</Cell> 
     <Cell>Some Path</Cell> 
     <Cell>800</Cell> 
     <Cell>190</Cell> 
     <Cell>256</Cell> 
     <Cell>1</Cell> 
     <Cell>image/jpeg</Cell> 
     <Cell></Cell> 
    </Row> 
</Rows> 
</data> 

注意:我已经使用相同的数据收集来制作两行数据。

+0

感谢这个例子,我明白如何动态地形成XML。 – nilarya