C#怎样比较两个xml里节点内容的不同(升级用)

comcyd 2012-05-02 11:28:34
有两个xml文件,结构是完全相同的:

server.xml
<?xml version="1.0" encoding="utf-8"?>
<FileInfo>
<file>
<Name>1.jpg</Name>
<Ldate>2012-05-01 </Ldate>
</file>

<file>
<Name>2.jpg</Name>
<Ldate>2012-05-02 </Ldate>
</file>

<file>
<Name>3.jpg</Name>
<Ldate>2012-04-02 17:27:56</Ldate>
</file>

<file>
<Name>4.jpg</Name>
<Ldate>2012-05-02 </Ldate>
</file>
<FileInfo>



client.xml
<?xml version="1.0" encoding="utf-8"?>
<FileInfo>
<file>
<Name>1.jpg</Name>
<Ldate>2012-04-01 </Ldate>
</file>

<file>
<Name>2.jpg</Name>
<Ldate>2012-04-02 </Ldate>
</file>

<file>
<Name>3.jpg</Name>
<Ldate>2012-04-02 </Ldate>
</file>
<FileInfo>


我的思路是要做一个升级程序,判断文件修改时间,然后获得最新的文件名称Name。

其中server.xml是服务器的文件列表,client.xml是客户端的文件信息.
1.如果有相同名称的文件,则比较LDate,取最新的修改时间的文件
2.如果没有相同的文件,则不用对比,直接取服务器里的文件

现在的目的是要得到需要更新的文件有:1.jpg,2.jpg,4.jpg(3.jpg没有更新过则不用更新,4.jpg是新增加的)
...全文
662 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
逍_遥_子 2014-01-18
  • 打赏
  • 举报
回复
楼主找到什么好的解决办法给个消息,我最近也在弄这个,用遍历比较蛋疼,有没有其他的好办法,推荐一下,在这里学习下,谢谢了
逍_遥_子 2014-01-18
  • 打赏
  • 举报
回复
我也想知道那个List<Dllfile>怎么写的,求指导啊,大神们
zhangjinlong9141 2012-11-27
  • 打赏
  • 举报
回复
3楼的大神...List<DllFile>怎么定义的呀。。
comcyd 2012-05-05
  • 打赏
  • 举报
回复
楼上的貌似比较麻烦,这里和大家分享一个好东西,用这个搞定了:

//比较两个xml文件的差异返回差异的列表
//定义了一个DllFile类来辅助,然后再根据差异的Lisst<DllFile>来生成一个对比后有差异的xml文件.
public List<DllFile> GetModiflyList<T>(List<DllFile> newModel, List<DllFile> oldModel)
{
List<DllFile> list = new List<DllFile>();
foreach (DllFile newMod in newModel)
{
bool IsExist = false;
foreach (DllFile oldMol in oldModel)
{
//取得老实体对象的属性集合
PropertyInfo[] pi = oldMol.GetType().GetProperties();
//定义记数器
int i = 0;

//将老实体对象的没一个属性值和新实体对象进行循环比较
foreach (PropertyInfo p in pi)
{
//防止object.Equals时实例化对象发生异常
object o_new = newMod.GetType().GetProperty(p.Name).GetValue(newMod, null);
if (o_new == null)
o_new = (object)String.Empty;

//防止object.Equals时实例化对象发生异常
object o_old = p.GetValue(oldMol, null);
if (o_old == null)
o_old = (object)String.Empty;

//新老实体比较并记录成功次数
if (object.Equals(o_new, o_old))
{
i++;
}
//若成功次数和属性数目相等则说明已经存在或者没有发生过修改条出循环
if (i == pi.Length)
{
IsExist = true;
break;
}
}

//没有发生过修改条出循环
if (IsExist)
break;
}

//如果不存在则添加该实体到List<T>中
if (!IsExist)
list.Add(newMod);

}
return list;
}
一克代码 2012-05-02
  • 打赏
  • 举报
回复
遍历比较xml

GetXmlData()
{
ArrayList headersubList = new ArrayList();
//获取当前XML文档的根 一级
XmlNode oNode = m_oDom.DocumentElement;

//获取根节点的所有子节点列表
XmlNodeList oList = oNode.ChildNodes;

//标记当前节点
XmlNode oCurrentNode;
//遍历所有二级节点
for (int i = 0; i < oList.Count; i++)
{
//二级
oCurrentNode = oList[i];

//检测当前节点的名称,节点的值是否与已知匹配
if (oCurrentNode.Name.ToLower().Equals("store"))
{
//检测是否有子节点 三级
if (oCurrentNode.HasChildNodes)
{
Console.WriteLine(oCurrentNode.ChildNodes.Count);

//遍历当前节点的所有子节点
for (int n = 0; n < oCurrentNode.ChildNodes.Count; n++)
{
//检测当前节点的子节点名称是否与已知匹配
if (oCurrentNode.ChildNodes[n].Name.ToLower() == "sale")
{
//获取该节点所有属性,以供查询
XmlNamedNodeMap oMap = oCurrentNode.ChildNodes[n].Attributes;

Hashtable headItem = new Hashtable();
headItem.Add("Id", oCurrentNode.Attributes.GetNamedItem("Id").Value);
headItem.Add("Name", oCurrentNode.Attributes.GetNamedItem("Name").Value);
headItem.Add("OrderNo", oMap.GetNamedItem("OrderNo").Value);
headItem.Add("Qty", oMap.GetNamedItem("Qty").Value);

headersubList.Add(headItem);

Console.WriteLine(oCurrentNode.Attributes.GetNamedItem("Id").Value);
Console.WriteLine(oCurrentNode.Attributes.GetNamedItem("Name").Value);
Console.WriteLine(oMap.GetNamedItem("OrderNo").Value);
Console.WriteLine(oMap.GetNamedItem("Qty").Value);

Console.ReadLine();
}
}
}
}
}
}

bdmh 2012-05-02
  • 打赏
  • 举报
回复
遍历比较 file节点的name相同的 Ldate的值

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧