using System;
using System.Xml;
namespace DTS.DASLib.Service
{
public class XMLHelper
{
public static System.Globalization.CultureInfo InvariantCulture = new System.Globalization.CultureInfo("");
public static string GetString(XmlReader reader)
{
if (reader.NodeType != XmlNodeType.Element)
{
throw new XmlException("XMLHelper.ReadElement: current node isn't an Element");
}
if (reader.IsEmptyElement)
{
return string.Empty;
}
var thisName = reader.Name;
if (!reader.Read())
{
throw new XmlException("XMLHelper.ReadElement: EOF");
}
if (reader.NodeType == XmlNodeType.EndElement) { return string.Empty; }
if (reader.NodeType != XmlNodeType.Text)
{
throw new XmlException("XMLHelper.ReadElement: current Element doesn't have text");
}
var value = reader.Value;
if (!reader.Read())
{
throw new XmlException("XMLHelper.ReadElement: EOF");
}
if (reader.NodeType != XmlNodeType.EndElement)
{
throw new XmlException("XMLHelper.ReadElement: current Element doesn't have an EndElement");
}
return value;
}
public static string TryGetString(XmlReader reader, string defaultValue)
{
try
{
return GetString(reader);
}
catch
{
return defaultValue;
}
}
public static double GetDouble(XmlReader reader)
{
var elemName = reader.Name;
var value = GetString(reader);
double result;
if (!double.TryParse(value, System.Globalization.NumberStyles.Float, InvariantCulture, out result))
{
throw new XmlException("XMLHelper.ReadXml: invalid " + elemName + " " + value);
}
return result;
}
public static double TryGetDouble(XmlReader reader, double defaultValue)
{
try
{
double result;
if (!double.TryParse(GetString(reader), System.Globalization.NumberStyles.Float, InvariantCulture, out result))
{
return defaultValue;
}
return result;
}
catch
{
return defaultValue;
}
}
public static float GetFloat(XmlReader reader)
{
var elemName = reader.Name;
var value = GetString(reader);
float result;
if (!float.TryParse(value, System.Globalization.NumberStyles.Float, InvariantCulture, out result))
{
throw new XmlException("XMLHelper.ReadXml: invalid " + elemName + " " + value);
}
return result;
}
public static int GetInt(XmlReader reader)
{
var elemName = reader.Name;
var value = GetString(reader);
int result;
if (!int.TryParse(value, System.Globalization.NumberStyles.Integer, InvariantCulture, out result))
{
throw new XmlException("XMLHelper.ReadXml: invalid " + elemName + " " + value);
}
return result;
}
public static int TryGetInt(XmlReader reader, int defaultValue)
{
try
{
int result;
if (!int.TryParse(GetString(reader), System.Globalization.NumberStyles.Integer, InvariantCulture, out result))
{
return defaultValue;
}
return result;
}
catch
{
return defaultValue;
}
}
///
/// reads a long from xmlreader, throws an exception if there's an issue
///
public static long GetInt64(XmlReader reader)
{
var elemName = reader.Name;
var value = GetString(reader);
long result;
if (!long.TryParse(value, System.Globalization.NumberStyles.Integer, InvariantCulture, out result))
{
throw new XmlException("XMLHelper.ReadXml: invalid " + elemName + " " + value);
}
return result;
}
public static uint GetUInt(XmlReader reader)
{
var elemName = reader.Name;
var value = GetString(reader);
uint result;
if (!uint.TryParse(value, System.Globalization.NumberStyles.Integer, InvariantCulture, out result))
{
throw new XmlException("XMLHelper.ReadXml: invalid " + elemName + " " + value);
}
return result;
}
public static UInt64 GetUInt64(XmlReader reader)
{
var elemName = reader.Name;
var value = GetString(reader);
UInt64 result;
if (!UInt64.TryParse(value, System.Globalization.NumberStyles.Integer, InvariantCulture, out result))
{
throw new XmlException("XMLHelper.ReadXml: invalid " + elemName + " " + value);
}
return result;
}
public static double? GetOptionalDouble(XmlReader reader)
{
var elemName = reader.Name;
if (reader.HasAttributes)
{
var attr = reader.GetAttribute("xsi:nil");
if (!string.IsNullOrEmpty(attr) && attr == "true")
{
return null;
}
attr = reader.GetAttribute("nil");
if (!string.IsNullOrEmpty(attr) && attr == "true") { return null; }
}
var value = GetString(reader);
double result;
if (!double.TryParse(value, System.Globalization.NumberStyles.Float, InvariantCulture, out result))
{
throw new XmlException("XMLHelper.ReadXml: invalid " + elemName + " " + value);
}
return result;
}
public static bool GetBool(XmlReader reader)
{
var elemName = reader.Name;
var value = GetString(reader);
bool result;
if (!bool.TryParse(value, out result))
{
throw new XmlException("XMLHelper.ReadXml: invalid " + elemName + " " + value);
}
return result;
}
public static void PutString(XmlWriter writer, string tag, string value)
{
writer.WriteStartElement(tag);
if (!string.IsNullOrEmpty(value))
{
writer.WriteString(value);
}
writer.WriteEndElement();
}
public static void PutInt(XmlWriter writer, string tag, int value)
{
writer.WriteStartElement(tag);
//if(value != null)
{
writer.WriteString(value.ToString(InvariantCulture));
}
writer.WriteEndElement();
}
///
/// writes a long to xml writer
/// can throw exceptions
///
public static void PutInt64(XmlWriter writer, string tag, long value)
{
writer.WriteStartElement(tag);
writer.WriteString(value.ToString(InvariantCulture));
writer.WriteEndElement();
}
public static void PutUInt(XmlWriter writer, string tag, uint value)
{
writer.WriteStartElement(tag);
//if(value != null)
{
writer.WriteString(value.ToString(InvariantCulture));
}
writer.WriteEndElement();
}
public static void PutUInt64(XmlWriter writer, string tag, UInt64 value)
{
writer.WriteStartElement(tag);
writer.WriteString(value.ToString(InvariantCulture));
writer.WriteEndElement();
}
public static void PutDouble(XmlWriter writer, string tag, double value)
{
writer.WriteStartElement(tag);
writer.WriteString(value.ToString("G17", InvariantCulture));
writer.WriteEndElement();
}
public static void PutOptionalDouble(XmlWriter writer, string tag, double? value)
{
writer.WriteStartElement(tag);
if (value == null)
{
writer.WriteAttributeString("xsi", "nil", null, "true");
}
else
{
writer.WriteString(((double)value).ToString("G17", InvariantCulture));
}
writer.WriteEndElement();
}
public static void PutBool(XmlWriter writer, string tag, bool value)
{
writer.WriteStartElement(tag);
writer.WriteString(value.ToString(InvariantCulture));
writer.WriteEndElement();
}
}
}