diff --git a/SabreTools.Library/DatFiles/Listxml.cs b/SabreTools.Library/DatFiles/Listxml.cs
index dd83c0d2..8f702330 100644
--- a/SabreTools.Library/DatFiles/Listxml.cs
+++ b/SabreTools.Library/DatFiles/Listxml.cs
@@ -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();
diff --git a/SabreTools.Library/DatFiles/Logiqx.cs b/SabreTools.Library/DatFiles/Logiqx.cs
index 93536fa4..fb18c0f3 100644
--- a/SabreTools.Library/DatFiles/Logiqx.cs
+++ b/SabreTools.Library/DatFiles/Logiqx.cs
@@ -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
diff --git a/SabreTools.Library/DatFiles/OfflineList.cs b/SabreTools.Library/DatFiles/OfflineList.cs
index 39953bb5..207b2afa 100644
--- a/SabreTools.Library/DatFiles/OfflineList.cs
+++ b/SabreTools.Library/DatFiles/OfflineList.cs
@@ -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();
diff --git a/SabreTools.Library/DatFiles/OpenMSX.cs b/SabreTools.Library/DatFiles/OpenMSX.cs
index 0859268e..6c5e007c 100644
--- a/SabreTools.Library/DatFiles/OpenMSX.cs
+++ b/SabreTools.Library/DatFiles/OpenMSX.cs
@@ -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;
}
diff --git a/SabreTools.Library/DatFiles/SabreDat.cs b/SabreTools.Library/DatFiles/SabreDat.cs
index 06bf3d97..cebbca8a 100644
--- a/SabreTools.Library/DatFiles/SabreDat.cs
+++ b/SabreTools.Library/DatFiles/SabreDat.cs
@@ -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
diff --git a/SabreTools.Library/DatFiles/SoftwareList.cs b/SabreTools.Library/DatFiles/SoftwareList.cs
index 628b983b..3db0d920 100644
--- a/SabreTools.Library/DatFiles/SoftwareList.cs
+++ b/SabreTools.Library/DatFiles/SoftwareList.cs
@@ -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)
{
diff --git a/SabreTools.Library/IO/XmlTextWriterExtensions.cs b/SabreTools.Library/IO/XmlTextWriterExtensions.cs
index e053f259..cf9b4b62 100644
--- a/SabreTools.Library/IO/XmlTextWriterExtensions.cs
+++ b/SabreTools.Library/IO/XmlTextWriterExtensions.cs
@@ -7,6 +7,21 @@ namespace SabreTools.Library.IO
///
public static class XmlTextWriterExtensions
{
+ // TODO: Rename Full to Required, add one for attributes
+
+ ///
+ /// Force writing separate open and start tags, even for empty elements
+ ///
+ /// XmlTextWriter to write out with
+ /// Name of the element
+ /// Value to write in the element
+ public static void WriteFullElementString(this XmlTextWriter writer, string localName, string value)
+ {
+ writer.WriteStartElement(localName);
+ writer.WriteRaw(value ?? string.Empty);
+ writer.WriteFullEndElement();
+ }
+
///
/// Write an attribute, if the value is not null or empty
///
@@ -20,16 +35,15 @@ namespace SabreTools.Library.IO
}
///
- /// Force writing separate open and start tags, even for empty elements
+ /// Write an element, if the value is not null or empty
///
/// XmlTextWriter to write out with
/// Name of the element
/// Value to write in the element
- 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);
}
}
}
diff --git a/SabreTools.Library/Tools/Converters.cs b/SabreTools.Library/Tools/Converters.cs
index 46056d78..efeea887 100644
--- a/SabreTools.Library/Tools/Converters.cs
+++ b/SabreTools.Library/Tools/Converters.cs
@@ -910,6 +910,8 @@ namespace SabreTools.Library.Tools
#endif
}
+ // TODO: Write From variants for all above
+
///
/// Get string value from input bool?
///