rimworld-animations/1.4/Source/Utilities/PatchOperationAddOrReplace.cs

60 lines
1.8 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using Verse;
namespace Rimworld_Animations
{
public class PatchOperationAddOrReplace : PatchOperationPathed
{
protected string key;
private XmlContainer value;
protected override bool ApplyWorker(XmlDocument xml)
{
XmlNode valNode = value.node;
bool result = false;
IEnumerator enumerator = xml.SelectNodes(xpath).GetEnumerator();
try
{
while (enumerator.MoveNext())
{
object obj = enumerator.Current;
result = true;
XmlNode parentNode = obj as XmlNode;
XmlNode xmlNode = parentNode.SelectSingleNode(key);
if (xmlNode == null)
{
// Add - Add node if not existing
xmlNode = parentNode.OwnerDocument.CreateElement(key);
parentNode.AppendChild(xmlNode);
}
else
{
// Replace - Clear existing children
xmlNode.RemoveAll();
}
// (Re)add value
xmlNode.AppendChild(parentNode.OwnerDocument.ImportNode(valNode.FirstChild, true));
}
}
finally
{
IDisposable disposable = enumerator as IDisposable;
if (disposable != null)
{
disposable.Dispose();
}
}
return result;
}
}
}