генерировать XML из динамического набора данных - PullRequest
0 голосов
/ 18 января 2012

У меня есть приложение ASP.net в c #, где у меня есть набор данных, который я могу передать в 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>

Это, очевидно, пример одной строки, в наборе данных несколько строк.Теперь я не знаю, как динамически форматировать блок 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>

Кто-нибудь может подсказать мне, как это сделать?

В моем приложении Я не будузаранее зная структуру набора данных. т. е. может быть результирующий набор данных, в котором у меня больше столбцов, чем описано в примере.Как я должен идти об этом?Любая помощь будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 18 января 2012

Это может быть обходной путь. Стандарт кода может быть лучше, но сейчас вы можете использовать следующее:

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 голосов
/ 18 января 2012

Попробуйте использовать DataTable, а затем преобразовать этот DataTable в поток XML или файл.

DataTable myDataTable = myDataSet.Tables[0];


myDataTable.WriteXml(..);

Вы найдете целую кучу перегрузок, таких как TextWriter, Stream. Наконец, вам нужно изменить этот XML, чтобы добавить узлы помимо DataTable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...