Skapa xml från filnamn i en mapp

Vi har tidigare visat ett koncept på hur man kan göra ett bildspel i flash med bildnamn som laddas från en xml-fil. Det är ett bra sätt så att man ska slippa att gå in i flash-filen och ändra varje gång man vill byta ut bilderna.

Vi använder den rätt ofta i våra egna projekt och hittills har vi sparat meta-data för bilderna i en databas. Det har sina fördelar ifall man vill spara bildtexter eller liknande.

Men det kan bli rätt omständigt att först göra en editor för att hantera bilduppladdingen. Därför skrev jag ett litet kodstycke i C# som kollar efter bilder i en angiven mapp, och skapar en xml-fil baserat på filnamnen.

I exemplet används två variabler som är sökvägar till xml- och bildmappar. Dessa läses i vårat fall in från Web.Config

//Här finns våra xml-filer
public static string strXmlRootPath = ConfigurationManager.AppSettings["XmlRootPath"];

//Här lagrar vi bilderna
public static string strMediaRootPath = ConfigurationManager.AppSettings["MediaRootPath"];

Funktionerna som skapar xml-filen

private void CreateSlideshow()
{
string strXMLPath = strXmlRootPath + "slideshow.xml";

if(File.Exists(strXMLPath))
{
DateTime dtLastWriteTime = Convert.ToDateTime( ""+File.GetLastWriteTime(strXMLPath) );
//Skapar bara en ny fil en gång varje timme
if( DateTime.Compare(DateTime.Now,dtLastWriteTime.AddMinutes(60))==1 )
{
CreateSlideshowXml();
}
}
else
{
CreateSlideshowXml();
}
}

public void CreateSlideshowXml()
{
try
{
string strXMLPath = strXmlRootPath + "slideshow.xml";
FileStream objFileStream = new FileStream(strXMLPath, FileMode.Create);
XmlTextWriter objXmlWriter = new XmlTextWriter(objFileStream, System.Text.Encoding.GetEncoding("utf-8"));//iso-8859-1
objXmlWriter.Formatting = Formatting.Indented;
objXmlWriter.WriteStartDocument();
objXmlWriter.WriteStartElement("images");

//Skapa array av alla filer i mappen för slideshow-bilder
String[] strFiles = Directory.GetFiles(strMediaRootPath + "slides/", "*");
string strFileName = string.Empty;
string strFullPath = string.Empty;

foreach (string strFile in strFiles)
{
strFileName = Path.GetFileName(strFile);
strFullPath = Path.GetFullPath(strFile);

objXmlWriter.WriteStartElement("pic");
//Url till bild
objXmlWriter.WriteStartElement("image");
objXmlWriter.WriteString(strMediaRootUrl + "slides/" + strFileName);
objXmlWriter.WriteEndElement();//Slut image
//Länk
objXmlWriter.WriteStartElement("link");
//Denna gång lämnar vi -link- tomt. Här kan man spara en url om bilderna ska vara klickbara
objXmlWriter.WriteEndElement();//Slut link

objXmlWriter.WriteEndElement();//Slut pic
}


objXmlWriter.WriteEndElement();//Slut images
objXmlWriter.WriteEndDocument();
objXmlWriter.Close();
}
catch (Exception objException)
{
Trace.Warn("XML-fil för slideshow kunde ej sparas! Fel: ",objException.Message);
}
}

Och slutligen spottas xml-filen ut som följer den här strukturen:

<?xml version="1.0" encoding="utf-8"?>
<images>
<pic>
<image>http://localhost:1643/test-site/media/slides/IMG_4954.jpg</image>
<link />
</pic>
<pic>
<image>http://localhost:1643/test-site/media/slides/IMG_4955.jpg</image>
<link />
</pic>
<pic>
<image>http://localhost:1643/test-site/media/slides/IMG_4956.jpg</image>
<link />
</pic>
<pic>
<image>http://localhost:1643/test-site/media/slides/IMG_4960.jpg</image>
<link />
</pic>
<pic>
<image>http://localhost:1643/test-site/media/slides/IMG_4961.jpg</image>
<link />
</pic>
</images>