Use better XML methods

This commit is contained in:
Matt Nadareski
2020-08-24 00:25:23 -07:00
parent fd489d5e4b
commit 06829d3d5f
8 changed files with 93 additions and 115 deletions

View File

@@ -995,16 +995,7 @@ namespace SabreTools.Library.DatFiles
xtw.WriteStartElement("mame");
xtw.WriteAttributeString("build", Header.Name);
switch (Header.Debug)
{
case true:
xtw.WriteAttributeString("debug", "yes");
break;
case false:
xtw.WriteAttributeString("debug", "no");
break;
}
xtw.WriteOptionalAttributeString("debug", Header.Debug.FromYesNo());
xtw.WriteOptionalAttributeString("mameconfig", Header.MameConfig);
xtw.Flush();

View File

@@ -761,39 +761,23 @@ namespace SabreTools.Library.DatFiles
xtw.WriteDocType("datafile", "-//Logiqx//DTD ROM Management Datafile//EN", "http://www.logiqx.com/Dats/datafile.dtd", null);
xtw.WriteStartElement("datafile");
xtw.WriteOptionalAttributeString("build", Header.Build);
switch (Header.Debug)
{
case true:
xtw.WriteAttributeString("debug", "yes");
break;
case false:
xtw.WriteAttributeString("debug", "no");
break;
}
xtw.WriteOptionalAttributeString("debug", Header.Debug.FromYesNo());
xtw.WriteStartElement("header");
xtw.WriteElementString("name", Header.Name);
xtw.WriteElementString("description", Header.Description);
if (!string.IsNullOrWhiteSpace(Header.RootDir))
xtw.WriteElementString("rootdir", Header.RootDir);
if (!string.IsNullOrWhiteSpace(Header.Category))
xtw.WriteElementString("category", Header.Category);
xtw.WriteElementString("version", Header.Version);
if (!string.IsNullOrWhiteSpace(Header.Date))
xtw.WriteElementString("date", Header.Date);
xtw.WriteElementString("author", Header.Author);
if (!string.IsNullOrWhiteSpace(Header.Email))
xtw.WriteElementString("email", Header.Email);
if (!string.IsNullOrWhiteSpace(Header.Homepage))
xtw.WriteElementString("homepage", Header.Homepage);
if (!string.IsNullOrWhiteSpace(Header.Url))
xtw.WriteElementString("url", Header.Url);
if (!string.IsNullOrWhiteSpace(Header.Comment))
xtw.WriteElementString("comment", Header.Comment);
if (!string.IsNullOrWhiteSpace(Header.Type))
xtw.WriteElementString("type", Header.Type);
xtw.WriteFullElementString("name", Header.Name);
xtw.WriteFullElementString("description", Header.Description);
xtw.WriteOptionalElementString("rootdir", Header.RootDir);
xtw.WriteOptionalElementString("category", Header.Category);
xtw.WriteFullElementString("version", Header.Version);
xtw.WriteOptionalElementString("date", Header.Date);
xtw.WriteFullElementString("author", Header.Author);
xtw.WriteOptionalElementString("email", Header.Email);
xtw.WriteOptionalElementString("homepage", Header.Homepage);
xtw.WriteOptionalElementString("url", Header.Url);
xtw.WriteOptionalElementString("comment", Header.Comment);
xtw.WriteOptionalElementString("type", Header.Type);
if (Header.ForcePacking != PackingFlag.None
|| Header.ForceMerging != MergingFlag.None
@@ -979,21 +963,21 @@ namespace SabreTools.Library.DatFiles
{
xtw.WriteStartElement("trurip");
xtw.WriteOptionalAttributeString("titleid", datItem.Machine.TitleID);
xtw.WriteOptionalAttributeString("publisher", datItem.Machine.Publisher);
xtw.WriteOptionalAttributeString("developer", datItem.Machine.Developer);
xtw.WriteOptionalAttributeString("year", datItem.Machine.Year);
xtw.WriteOptionalAttributeString("genre", datItem.Machine.Genre);
xtw.WriteOptionalAttributeString("subgenre", datItem.Machine.Subgenre);
xtw.WriteOptionalAttributeString("ratings", datItem.Machine.Ratings);
xtw.WriteOptionalAttributeString("score", datItem.Machine.Score);
xtw.WriteOptionalAttributeString("players", datItem.Machine.Players);
xtw.WriteOptionalAttributeString("enabled", datItem.Machine.Enabled);
xtw.WriteOptionalAttributeString("titleid", datItem.Machine.TitleID);
xtw.WriteOptionalAttributeString("crc", datItem.Machine.HasCrc.FromYesNo());
xtw.WriteOptionalAttributeString("source", datItem.Machine.SourceFile);
xtw.WriteOptionalAttributeString("cloneof", datItem.Machine.CloneOf);
xtw.WriteOptionalAttributeString("relatedto", datItem.Machine.RelatedTo);
xtw.WriteOptionalElementString("titleid", datItem.Machine.TitleID);
xtw.WriteOptionalElementString("publisher", datItem.Machine.Publisher);
xtw.WriteOptionalElementString("developer", datItem.Machine.Developer);
xtw.WriteOptionalElementString("year", datItem.Machine.Year);
xtw.WriteOptionalElementString("genre", datItem.Machine.Genre);
xtw.WriteOptionalElementString("subgenre", datItem.Machine.Subgenre);
xtw.WriteOptionalElementString("ratings", datItem.Machine.Ratings);
xtw.WriteOptionalElementString("score", datItem.Machine.Score);
xtw.WriteOptionalElementString("players", datItem.Machine.Players);
xtw.WriteOptionalElementString("enabled", datItem.Machine.Enabled);
xtw.WriteOptionalElementString("titleid", datItem.Machine.TitleID);
xtw.WriteOptionalElementString("crc", datItem.Machine.HasCrc.FromYesNo());
xtw.WriteOptionalElementString("source", datItem.Machine.SourceFile);
xtw.WriteOptionalElementString("cloneof", datItem.Machine.CloneOf);
xtw.WriteOptionalElementString("relatedto", datItem.Machine.RelatedTo);
// End trurip
xtw.WriteEndElement();
@@ -1100,8 +1084,7 @@ namespace SabreTools.Library.DatFiles
var rom = datItem as Rom;
xtw.WriteStartElement("rom");
xtw.WriteAttributeString("name", rom.Name);
if (rom.Size != -1)
xtw.WriteAttributeString("size", rom.Size.ToString());
if (rom.Size != -1) xtw.WriteAttributeString("size", rom.Size.ToString());
xtw.WriteOptionalAttributeString("crc", rom.CRC.ToLowerInvariant());
xtw.WriteOptionalAttributeString("md5", rom.MD5.ToLowerInvariant());
#if NET_FRAMEWORK

View File

@@ -773,11 +773,11 @@ namespace SabreTools.Library.DatFiles
xtw.WriteAttributeString("noNamespaceSchemaLocation", "xsi", "datas.xsd");
xtw.WriteStartElement("configuration");
xtw.WriteElementString("datName", Header.Name);
xtw.WriteFullElementString("datName", Header.Name);
xtw.WriteElementString("datVersion", Items.TotalCount.ToString());
xtw.WriteElementString("system", Header.System ?? string.Empty);
xtw.WriteElementString("screenshotsWidth", Header.ScreenshotsWidth ?? string.Empty);
xtw.WriteElementString("screenshotsHeight", Header.ScreenshotsHeight ?? string.Empty);
xtw.WriteFullElementString("system", Header.System);
xtw.WriteFullElementString("screenshotsWidth", Header.ScreenshotsWidth);
xtw.WriteFullElementString("screenshotsHeight", Header.ScreenshotsHeight);
if (Header.Infos != null)
{
@@ -810,14 +810,14 @@ namespace SabreTools.Library.DatFiles
}
xtw.WriteStartElement("newDat");
xtw.WriteElementString("datVersionURL", Header.Url);
xtw.WriteFullElementString("datVersionURL", Header.Url);
xtw.WriteStartElement("datUrl");
xtw.WriteAttributeString("fileName", $"{Header.FileName}.zip");
xtw.WriteString(Header.Url);
xtw.WriteEndElement();
xtw.WriteElementString("imURL", Header.Url);
xtw.WriteFullElementString("imURL", Header.Url);
// End newDat
xtw.WriteEndElement();
@@ -863,7 +863,7 @@ namespace SabreTools.Library.DatFiles
// End search
xtw.WriteEndElement();
xtw.WriteElementString("romTitle", Header.RomTitle ?? "%u - %n");
xtw.WriteFullElementString("romTitle", Header.RomTitle ?? "%u - %n");
// End configuration
xtw.WriteEndElement();
@@ -903,16 +903,16 @@ namespace SabreTools.Library.DatFiles
xtw.WriteStartElement("game");
xtw.WriteElementString("imageNumber", "1");
xtw.WriteElementString("releaseNumber", "1");
xtw.WriteElementString("title", datItem.Name ?? string.Empty);
xtw.WriteFullElementString("title", datItem.Name);
xtw.WriteElementString("saveType", "None");
if (datItem.ItemType == ItemType.Rom)
{
var rom = datItem as Rom;
xtw.WriteElementString("romSize", rom.Size.ToString() ?? string.Empty);
xtw.WriteFullElementString("romSize", rom.Size.ToString());
}
xtw.WriteElementString("publisher", datItem.Machine.Publisher ?? string.Empty);
xtw.WriteFullElementString("publisher", datItem.Machine.Publisher);
xtw.WriteElementString("location", "0");
xtw.WriteElementString("sourceRom", "None");
xtw.WriteElementString("language", "0");
@@ -973,8 +973,8 @@ namespace SabreTools.Library.DatFiles
xtw.WriteElementString("im1CRC", "00000000");
xtw.WriteElementString("im2CRC", "00000000");
xtw.WriteElementString("comment", datItem.Machine.Comment ?? string.Empty);
xtw.WriteElementString("duplicateID", datItem.Machine.CloneOf ?? string.Empty);
xtw.WriteFullElementString("comment", datItem.Machine.Comment);
xtw.WriteFullElementString("duplicateID", datItem.Machine.CloneOf);
// End game
xtw.WriteEndElement();

View File

@@ -660,12 +660,12 @@ namespace SabreTools.Library.DatFiles
// Build the state
xtw.WriteStartElement("software");
xtw.WriteElementString("title", datItem.Machine.Name);
xtw.WriteElementString("genmsxid", datItem.Machine.GenMSXID);
xtw.WriteElementString("system", datItem.Machine.System);
xtw.WriteElementString("company", datItem.Machine.Manufacturer);
xtw.WriteElementString("year", datItem.Machine.Year);
xtw.WriteElementString("country", datItem.Machine.Country);
xtw.WriteFullElementString("title", datItem.Machine.Name);
xtw.WriteFullElementString("genmsxid", datItem.Machine.GenMSXID);
xtw.WriteFullElementString("system", datItem.Machine.System);
xtw.WriteFullElementString("company", datItem.Machine.Manufacturer);
xtw.WriteFullElementString("year", datItem.Machine.Year);
xtw.WriteFullElementString("country", datItem.Machine.Country);
xtw.Flush();
}
@@ -740,35 +740,27 @@ namespace SabreTools.Library.DatFiles
case OpenMSXSubType.Rom:
case OpenMSXSubType.NULL:
xtw.WriteStartElement("rom");
xtw.WriteElementString("hash", rom.SHA1.ToLowerInvariant());
if (!string.IsNullOrWhiteSpace(rom.Offset))
xtw.WriteElementString("start", rom.Offset);
if (!string.IsNullOrWhiteSpace(rom.OpenMSXType))
xtw.WriteElementString("type", rom.OpenMSXType);
if (!string.IsNullOrWhiteSpace(rom.Remark))
xtw.WriteElementString("remark", rom.Remark);
xtw.WriteFullElementString("hash", rom.SHA1.ToLowerInvariant());
xtw.WriteOptionalElementString("start", rom.Offset);
xtw.WriteOptionalElementString("type", rom.OpenMSXType);
xtw.WriteOptionalElementString("remark", rom.Remark);
xtw.WriteEndElement();
break;
case OpenMSXSubType.MegaRom:
xtw.WriteStartElement("megarom");
xtw.WriteElementString("hash", rom.SHA1.ToLowerInvariant());
if (!string.IsNullOrWhiteSpace(rom.Offset))
xtw.WriteElementString("start", rom.Offset);
if (!string.IsNullOrWhiteSpace(rom.OpenMSXType))
xtw.WriteElementString("type", rom.OpenMSXType);
if (!string.IsNullOrWhiteSpace(rom.Remark))
xtw.WriteElementString("remark", rom.Remark);
xtw.WriteFullElementString("hash", rom.SHA1.ToLowerInvariant());
xtw.WriteOptionalElementString("start", rom.Offset);
xtw.WriteOptionalElementString("type", rom.OpenMSXType);
xtw.WriteOptionalElementString("remark", rom.Remark);
xtw.WriteEndElement();
break;
case OpenMSXSubType.SCCPlusCart:
xtw.WriteStartElement("sccpluscart");
if (!string.IsNullOrWhiteSpace(rom.Boot))
xtw.WriteElementString("boot", rom.Boot);
xtw.WriteElementString("hash", rom.SHA1.ToLowerInvariant());
if (!string.IsNullOrWhiteSpace(rom.Remark))
xtw.WriteElementString("remark", rom.Remark);
xtw.WriteOptionalElementString("boot", rom.Boot);
xtw.WriteFullElementString("hash", rom.SHA1.ToLowerInvariant());
xtw.WriteOptionalElementString("remark", rom.Remark);
xtw.WriteEndElement();
break;
}

View File

@@ -663,18 +663,14 @@ namespace SabreTools.Library.DatFiles
xtw.WriteStartElement("header");
xtw.WriteElementString("name", Header.Name);
xtw.WriteElementString("description", Header.Description);
if (!string.IsNullOrWhiteSpace(Header.RootDir))
xtw.WriteElementString("rootdir", Header.RootDir);
if (!string.IsNullOrWhiteSpace(Header.Category))
xtw.WriteElementString("category", Header.Category);
xtw.WriteElementString("version", Header.Version);
if (!string.IsNullOrWhiteSpace(Header.Date))
xtw.WriteElementString("date", Header.Date);
xtw.WriteElementString("author", Header.Author);
if (!string.IsNullOrWhiteSpace(Header.Comment))
xtw.WriteElementString("comment", Header.Comment);
xtw.WriteFullElementString("name", Header.Name);
xtw.WriteFullElementString("description", Header.Description);
xtw.WriteOptionalElementString("rootdir", Header.RootDir);
xtw.WriteOptionalElementString("category", Header.Category);
xtw.WriteFullElementString("version", Header.Version);
xtw.WriteOptionalElementString("date", Header.Date);
xtw.WriteFullElementString("author", Header.Author);
xtw.WriteOptionalElementString("comment", Header.Comment);
if (!string.IsNullOrWhiteSpace(Header.Type)
|| Header.ForcePacking != PackingFlag.None
|| Header.ForceMerging != MergingFlag.None

View File

@@ -820,10 +820,10 @@ namespace SabreTools.Library.DatFiles
break;
}
xtw.WriteOptionalAttributeString("description", datItem.Machine.Description);
xtw.WriteOptionalAttributeString("year", datItem.Machine.Year);
xtw.WriteOptionalAttributeString("publisher", datItem.Machine.Publisher);
xtw.WriteOptionalAttributeString("category", datItem.Machine.Category);
xtw.WriteOptionalElementString("description", datItem.Machine.Description);
xtw.WriteOptionalElementString("year", datItem.Machine.Year);
xtw.WriteOptionalElementString("publisher", datItem.Machine.Publisher);
xtw.WriteOptionalElementString("category", datItem.Machine.Category);
if (datItem.Machine.Infos != null && datItem.Machine.Infos.Count > 0)
{

View File

@@ -7,6 +7,21 @@ namespace SabreTools.Library.IO
/// </summary>
public static class XmlTextWriterExtensions
{
// TODO: Rename Full to Required, add one for attributes
/// <summary>
/// Force writing separate open and start tags, even for empty elements
/// </summary>
/// <param name="writer">XmlTextWriter to write out with</param>
/// <param name="localName">Name of the element</param>
/// <param name="value">Value to write in the element</param>
public static void WriteFullElementString(this XmlTextWriter writer, string localName, string value)
{
writer.WriteStartElement(localName);
writer.WriteRaw(value ?? string.Empty);
writer.WriteFullEndElement();
}
/// <summary>
/// Write an attribute, if the value is not null or empty
/// </summary>
@@ -20,16 +35,15 @@ namespace SabreTools.Library.IO
}
/// <summary>
/// Force writing separate open and start tags, even for empty elements
/// Write an element, if the value is not null or empty
/// </summary>
/// <param name="writer">XmlTextWriter to write out with</param>
/// <param name="localName">Name of the element</param>
/// <param name="value">Value to write in the element</param>
public static void WriteFullElementString(this XmlTextWriter writer, string localName, string value)
public static void WriteOptionalElementString(this XmlTextWriter writer, string localName, string value)
{
writer.WriteStartElement(localName);
writer.WriteRaw(value);
writer.WriteFullEndElement();
if (string.IsNullOrEmpty(value))
writer.WriteElementString(localName, value);
}
}
}

View File

@@ -910,6 +910,8 @@ namespace SabreTools.Library.Tools
#endif
}
// TODO: Write From variants for all above
/// <summary>
/// Get string value from input bool?
/// </summary>