wasStitchNET

Subversion Repositories:
Compare Path: Rev
With Path: Rev
?path1? @ 6  →  ?path2? @ 7
/Patchers/XML.cs
@@ -0,0 +1,58 @@
///////////////////////////////////////////////////////////////////////////
// Copyright (C) Wizardry and Steamworks 2017 - License: GNU GPLv3 //
// Please see: http://www.gnu.org/licenses/gpl.html for legal details, //
// rights of fair usage, the disclaimer and warranty conditions. //
///////////////////////////////////////////////////////////////////////////
 
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using System.Xml.XPath;
 
namespace wasStitchNET.Patchers
{
public static class XML
{
public static XDocument PatchConfiguration(XDocument cfg, XDocument nfg, HashSet<string> configuredTags)
{
/*foreach (var e in nfg.Descendants()
.Where(e => !configuredTags.Contains(e.Name.LocalName) &&
!e.Ancestors().Any(o => configuredTags.Contains(o.Name.LocalName))))*/
foreach (var e in nfg.Descendants()
.Where(e => configuredTags.Contains(e.Name.LocalName)))
{
// Select the element in the current configuration that is found in the default configuration.
var cfgElement = cfg.XPathSelectElement(e.GetAbsoluteXPath());
switch (cfgElement != null)
{
// Element found in current configuration.
case true:
// Only set the element value if it has no descendants.
if (!cfgElement.Descendants().Any())
cfgElement.Value = e.Value;
break;
// Element not found in the current configuration.
default:
// Find the first existing parent of the default configuration in the current configuration.
var parent = e.Parent;
XElement cfgParentElement = null;
do
{
cfgParentElement = cfg.XPathSelectElement(parent.GetAbsoluteXPath());
parent = e.Parent;
} while (cfgParentElement == null);
 
// Add the default configuration parent to the current configuration.
cfgParentElement = nfg.XPathSelectElement(cfgParentElement.GetAbsoluteXPath());
break;
}
}
return cfg;
}
}
}