#region 对比修改
/// <summary>
/// 对比修改
/// </summary>
/// <param name="f">文件名称</param>
void compareAlter(string f)
{
string oldPath = System.IO.Directory.GetCurrentDirectory() + f;
string newPath = System.IO.Directory.GetCurrentDirectory() + f;
XmlDocument oldXmlDoc = new XmlDocument();
oldXmlDoc.Load(oldPath);
XmlDocument newXmlDoc = new XmlDocument();
newXmlDoc.Load(newPath);
compareElement(oldXmlDoc, newXmlDoc);
newXmlDoc.Save(newPath);
oldXmlDoc.Save(oldPath);
}
#endregion
#region 遍历两个文件的节点,找到相同节点,进行修改
/// <summary>
/// 遍历文件节点,找到相同节点,进行修改
/// </summary>
/// <param name="oldNode">原根节点</param>
/// <param name="newNode">现根节点</param>
void compareElement(XmlNode oldNode, XmlNode newNode)
{
foreach (XmlNode oldN in oldNode.ChildNodes)
{
if (oldN.NodeType != XmlNodeType.Element)
{ continue; }
foreach (XmlNode newN in newNode.ChildNodes)
{
if (oldN.Name == newN.Name && oldN.NodeType == newN.NodeType)
{
XmlElement olds = (XmlElement)oldN;
XmlElement news = (XmlElement)newN;
//节点带有属性的
if (olds.HasAttributes)
{
// 循环读取每个属性
foreach (XmlAttribute att in olds.Attributes)
{
string attName = att.Name; // 得到属性名
string attVal = att.Value; // 得到属性值
news.SetAttribute(attName, attVal);
}
}
//一个元素只有innerText的 eg:<a>1</a>
if (oldN.ChildNodes.Count == 1 && oldN.FirstChild.NodeType == XmlNodeType.Text)
{
news.InnerText = olds.InnerText;
break;
}
//一个节点里有多个相同名字的节点 ge:<a> <i>1</i> <i>2</i> <i>3</i> </a>
if (oldN.ChildNodes.Count > 1 && oldN.FirstChild.NodeType == XmlNodeType.Element
&& oldN.ChildNodes.Count == newN.ChildNodes.Count
&& oldN.ChildNodes[0].Name == oldN.ChildNodes[oldN.ChildNodes.Count - 1].Name)
{
for (int i = 0; i < oldN.ChildNodes.Count; i++)
{
olds.ChildNodes[i].InnerText = news.ChildNodes[i].InnerText;
// 循环读取每个属性
foreach (XmlAttribute att in olds.ChildNodes[i].Attributes)
{
string attName = att.Name; // 得到属性名
string attVal = att.Value; // 得到属性值
((XmlElement)news.ChildNodes[i]).SetAttribute(attName, attVal);
}
}
break;
}
//有子元素的递归
if (oldN.ChildNodes.Count > 0 && oldN.FirstChild.NodeType != XmlNodeType.Text)
{
compareElement(oldN, newN);
}
break;
}
}
}
}
#endregion
/// <summary>
/// 对比修改
/// </summary>
/// <param name="f">文件名称</param>
void compareAlter(string f)
{
string oldPath = System.IO.Directory.GetCurrentDirectory() + f;
string newPath = System.IO.Directory.GetCurrentDirectory() + f;
XmlDocument oldXmlDoc = new XmlDocument();
oldXmlDoc.Load(oldPath);
XmlDocument newXmlDoc = new XmlDocument();
newXmlDoc.Load(newPath);
compareElement(oldXmlDoc, newXmlDoc);
newXmlDoc.Save(newPath);
oldXmlDoc.Save(oldPath);
}
#endregion
#region 遍历两个文件的节点,找到相同节点,进行修改
/// <summary>
/// 遍历文件节点,找到相同节点,进行修改
/// </summary>
/// <param name="oldNode">原根节点</param>
/// <param name="newNode">现根节点</param>
void compareElement(XmlNode oldNode, XmlNode newNode)
{
foreach (XmlNode oldN in oldNode.ChildNodes)
{
if (oldN.NodeType != XmlNodeType.Element)
{ continue; }
foreach (XmlNode newN in newNode.ChildNodes)
{
if (oldN.Name == newN.Name && oldN.NodeType == newN.NodeType)
{
XmlElement olds = (XmlElement)oldN;
XmlElement news = (XmlElement)newN;
//节点带有属性的
if (olds.HasAttributes)
{
// 循环读取每个属性
foreach (XmlAttribute att in olds.Attributes)
{
string attName = att.Name; // 得到属性名
string attVal = att.Value; // 得到属性值
news.SetAttribute(attName, attVal);
}
}
//一个元素只有innerText的 eg:<a>1</a>
if (oldN.ChildNodes.Count == 1 && oldN.FirstChild.NodeType == XmlNodeType.Text)
{
news.InnerText = olds.InnerText;
break;
}
//一个节点里有多个相同名字的节点 ge:<a> <i>1</i> <i>2</i> <i>3</i> </a>
if (oldN.ChildNodes.Count > 1 && oldN.FirstChild.NodeType == XmlNodeType.Element
&& oldN.ChildNodes.Count == newN.ChildNodes.Count
&& oldN.ChildNodes[0].Name == oldN.ChildNodes[oldN.ChildNodes.Count - 1].Name)
{
for (int i = 0; i < oldN.ChildNodes.Count; i++)
{
olds.ChildNodes[i].InnerText = news.ChildNodes[i].InnerText;
// 循环读取每个属性
foreach (XmlAttribute att in olds.ChildNodes[i].Attributes)
{
string attName = att.Name; // 得到属性名
string attVal = att.Value; // 得到属性值
((XmlElement)news.ChildNodes[i]).SetAttribute(attName, attVal);
}
}
break;
}
//有子元素的递归
if (oldN.ChildNodes.Count > 0 && oldN.FirstChild.NodeType != XmlNodeType.Text)
{
compareElement(oldN, newN);
}
break;
}
}
}
}
#endregion