200 lines
6.5 KiB
C#
200 lines
6.5 KiB
C#
using Sarand.Net.Standard.Base.Core;
|
|
using Sarand.Net.Standard.Base.Utils;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Text;
|
|
using System.Xml;
|
|
using System.Xml.Linq;
|
|
|
|
namespace Sarand.Net.Standard.Base.Utils
|
|
{
|
|
//=======================================================================
|
|
public static class SacsXmlUtil
|
|
{
|
|
//-------------------------------------------------------------------
|
|
// Data members.
|
|
public static Encoding DefaultEncoding { get; } = Encoding.UTF8;
|
|
|
|
//-------------------------------------------------------------------
|
|
/// <summary>Retrieve the Xml Declaration from the XML document.</summary>
|
|
public static XDeclaration GetXmlDeclaration (this XDocument xmlDoc)
|
|
{
|
|
return xmlDoc.Declaration;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Namespace.
|
|
public static String GetNamespacePrefix (this XElement element)
|
|
{
|
|
if (element.Name.Namespace != null)
|
|
return element.GetPrefixOfNamespace(element.Name.Namespace);
|
|
return "";
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Convert XML document to string.
|
|
public static String GetXml (this XContainer container, Encoding encoding = null)
|
|
{
|
|
//return container.ToString(SaveOptions.DisableFormatting);
|
|
|
|
var builder = new StringBuilder();
|
|
var settings = new XmlWriterSettings()
|
|
{
|
|
Indent = false
|
|
};
|
|
using (var writer = XmlWriter.Create(builder, settings))
|
|
{
|
|
container.WriteTo(writer);
|
|
}
|
|
return builder.ToString();
|
|
}
|
|
public static String FormatXml (this XContainer container, Encoding encoding = null)
|
|
{
|
|
//return container.ToString();
|
|
|
|
var builder = new StringBuilder();
|
|
var settings = new XmlWriterSettings()
|
|
{
|
|
Indent = true
|
|
};
|
|
using (var writer = XmlWriter.Create(builder, settings))
|
|
{
|
|
container.WriteTo(writer);
|
|
}
|
|
return builder.ToString();
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// N o d e N a m e
|
|
//-------------------------------------------------------------------
|
|
public static String GetLocalName (this XElement element)
|
|
{
|
|
return element?.Name?.LocalName ?? "";
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// A t t r i b u t e s
|
|
//-------------------------------------------------------------------
|
|
public static XAttribute GetAttribute (this XElement element, String name)
|
|
{
|
|
foreach (XAttribute attribute in element.Attributes())
|
|
if (attribute.Name.LocalName.EqualsCI(name))
|
|
return attribute;
|
|
return null;
|
|
}
|
|
public static bool HasAttribute (this XElement element, String name)
|
|
{
|
|
return element.GetAttribute(name) != null;
|
|
}
|
|
public static String GetAttributeValue (this XElement element, String name)
|
|
{
|
|
XAttribute attribute = element.GetAttribute(name);
|
|
if (attribute != null) return attribute.Value;
|
|
return "";
|
|
}
|
|
public static void SetAttribute (this XElement element, String name, String value)
|
|
{
|
|
element.SetAttributeValue(name, value);
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// C h i l d N o d e s
|
|
//-------------------------------------------------------------------
|
|
public static List<XElement> GetChildElements (this XContainer container, String name = "")
|
|
{
|
|
List<XElement> childElements = new List<XElement>();
|
|
if (container == null) return childElements;
|
|
foreach (XElement element in container.Elements())
|
|
{
|
|
if (StringUtil.IsEmpty(name) || element.Name.LocalName.EqualsCI(name))
|
|
childElements.Add(new XElement(element));
|
|
}
|
|
return childElements;
|
|
}
|
|
public static bool HasChildNode (this XContainer container, String name)
|
|
{
|
|
if (container == null) return false;
|
|
foreach (XElement element in container.Elements())
|
|
{
|
|
if (StringUtil.IsEmpty(name) || element.Name.LocalName.EqualsCI(name))
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
public static XElement GetFirstChildElement (this XContainer container, String name = "")
|
|
{
|
|
if (container == null) return null;
|
|
foreach (XElement element in container.Elements())
|
|
{
|
|
if (StringUtil.IsEmpty(name) || element.Name.LocalName.EqualsCI(name))
|
|
return element;
|
|
}
|
|
return null;
|
|
}
|
|
public static XElement GetNextSiblingElement (this XElement child, String name = "")
|
|
{
|
|
if (child == null) return null;
|
|
XNode sibling = null;
|
|
while ((sibling = child.NextNode) != null)
|
|
{
|
|
if (sibling is XElement && (StringUtil.IsEmpty(name) || (sibling as XElement).Name.LocalName.EqualsCI(name)))
|
|
return sibling as XElement;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// System.Xml.Linq variation.
|
|
/// <summary>Get text from first child that matches the node name.</summary>
|
|
public static String GetChildText (this XElement element, String name)
|
|
{
|
|
foreach (XElement child in element.Elements())
|
|
if (child.Name.LocalName.EqualsCI(name))
|
|
return child.Value;
|
|
return String.Empty;
|
|
}
|
|
// System.Xml varations.
|
|
public static String GetChildText(this XmlNode node, String name)
|
|
{
|
|
foreach (XmlNode child in node.ChildNodes)
|
|
if (child.Name.EqualsCI(name))
|
|
return child.InnerText;
|
|
return String.Empty;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Append element to node.
|
|
// System.Xml.Linq variation.
|
|
public static XElement AppendElement (this XContainer container, XElement element)
|
|
{
|
|
container.Add(element);
|
|
return element;
|
|
}
|
|
public static XElement AppendElement (this XContainer container, String name, String text = "")
|
|
{
|
|
XElement child = new XElement(name, text);
|
|
container.Add(child);
|
|
return child;
|
|
}
|
|
public static XElement AppendElement (this XContainer container, XNamespace xmlNamespace, String name, String text = "")
|
|
{
|
|
XElement child = new XElement(xmlNamespace + name, text);
|
|
container.Add(child);
|
|
return child;
|
|
}
|
|
// System.Xml varations.
|
|
public static XmlElement AppendElement(this XmlNode node, String name, String text = "")
|
|
{
|
|
XmlDocument doc = (node is XmlDocument ? node as XmlDocument : node.OwnerDocument);
|
|
XmlElement child = (XmlElement)node.AppendChild(doc.CreateElement(name));
|
|
if (!StringUtil.IsEmpty(text))
|
|
child.AppendChild(doc.CreateTextNode(text));
|
|
return child;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
}
|
|
//=======================================================================
|
|
}
|