Asp.net 从动态数据集生成XML

Asp.net 从动态数据集生成XML,asp.net,xml,c#-3.0,Asp.net,Xml,C# 3.0,我在c#中有一个ASP.net应用程序,其中有一个数据集,我可以使用以下简单代码块将其转换为xml: string result; using (StringWriter sw = new StringWriter()) { ds.WriteXml(sw); result = sw.ToString(); } 这将生成如下所示的xml块: <NewDataSet> <ImageInfo> <ImageID>1</ImageID> <Imag

我在c#中有一个ASP.net应用程序,其中有一个数据集,我可以使用以下简单代码块将其转换为xml:

string result;
using (StringWriter sw = new StringWriter())
{
ds.WriteXml(sw);
result = sw.ToString();
}
这将生成如下所示的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>

1.
untitled.bmp
某条路
800
190
256
1.
图像/jpeg
这显然是一行的例子,数据集中有多行。现在,我不知道如何动态格式化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>

1.
untitled.bmp
某条路
800
190
256
1.
图像/jpeg
.
.
.
有人能指导我怎么做吗?


在我的应用程序中,我不会事先知道数据集的结构。也就是说,可能会有一个结果数据集,其中我的列比示例中描述的多。我该怎么做?任何帮助都将不胜感激。

尝试使用数据表,然后将该数据表转换为XML流或文件

DataTable myDataTable = myDataSet.Tables[0];


myDataTable.WriteXml(..);

你会发现一大堆重载,比如TextWriter、Stream。最后,您需要修改该xml以添加数据表之外的节点。

这可能是一个解决方法。代码标准可能更好,但目前您可以使用以下内容:

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>");
XmlDocument doc=新的XmlDocument();
XmlDocument Outputdoc=新的XmlDocument();
doc.LoadXml(“1 untitled.bmp某些路径800 190 256 1 image/jpeg 1 untitled.bmp某些路径800 190 256 1 image/jpeg”);
XmlNode node=doc.SelectSingleNode(“/NewDataSet/ImageInfo”);
XmlNodeList节点=node.ChildNodes;
XmlDocument newdoc=null;
StringBuilder sb=新的StringBuilder(“”);
string lastNode=string.Empty;
string firstNode=string.Empty;
foreach(node.ChildNodes中的XmlNode)
{
if(n.Name.Equals(firstNode))
打破
if(string.IsNullOrEmpty(firstNode))
firstNode=n.名称;
newdoc=newxmldocument();
XmlNode newNode=newdoc.CreateElement(“列”);
xmldattribute newAttribute=newdoc.CreateAttribute(“名称”);
newAttribute.Value=n.Name;
newNode.Attributes.Append(newAttribute);
newdoc.AppendChild(newNode);
sb.Append(newdoc.InnerXml);
lastNode=n.Name;
}
某人加上(“”);
foreach(node.ChildNodes中的XmlNode xnode)
{
XmlDocument newdoc1=新的XmlDocument();
XmlNode newNode=newdoc1.CreateElement(“单元格”);
newNode.InnerText=xnode.InnerText;
newdoc1.AppendChild(newNode);
sb.Append(newdoc1.InnerXml);
if(xnode.Name.Equals(lastNode))
某人加上(“”);
}
某人加上(“”);
这是完成任务的一种非常快速的方法。你可以自由地标准化代码。现在看一下输出,它看起来与您需要的相同:

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

1.
untitled.bmp
某某
800
190
256
1.
图像/jpeg
1.
untitled.bmp
某条路
800
190
256
1.
图像/jpeg

注意:我使用了相同的数据收集来生成两行数据。

谢谢您的回复。但这不是我要问的。我提到我可以从数据集中获取第一个xml块。我想知道,如您所说,如何修改xml以添加节点,使其看起来像问题中的第二个xml块。再次感谢。感谢这个例子,我理解了如何动态地形成XML。