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

View File

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

View File

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

View File

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

View File

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

View File

@@ -7,6 +7,21 @@ namespace SabreTools.Library.IO
/// </summary> /// </summary>
public static class XmlTextWriterExtensions 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> /// <summary>
/// Write an attribute, if the value is not null or empty /// Write an attribute, if the value is not null or empty
/// </summary> /// </summary>
@@ -20,16 +35,15 @@ namespace SabreTools.Library.IO
} }
/// <summary> /// <summary>
/// Force writing separate open and start tags, even for empty elements /// Write an element, if the value is not null or empty
/// </summary> /// </summary>
/// <param name="writer">XmlTextWriter to write out with</param> /// <param name="writer">XmlTextWriter to write out with</param>
/// <param name="localName">Name of the element</param> /// <param name="localName">Name of the element</param>
/// <param name="value">Value to write in 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); if (string.IsNullOrEmpty(value))
writer.WriteRaw(value); writer.WriteElementString(localName, value);
writer.WriteFullEndElement();
} }
} }
} }

View File

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