回到家跟孩子玩她的玩具,小狗头上金色的蝴蝶结真好看,快乐简单到不需要任何条件,有种回到童年的感觉,跟快两岁的女儿在一起,生活充满快乐。我也变成了懂得欣赏、满足于当下的快乐的孩子,因为心全部地在所爱的事物上,童年很轻易就有的快乐,长大后却变成一件奢侈的事,还是因为心啊。长大后的很多年后,开始修炼一颗“复归于婴儿”的心了。原来,生命最初的眼光看世界,就是最幸福的。
下面内容是回家的车上写的,今天的工作内容遇到的问题和处理办法,或许会提供一点参考。如果不感兴趣的朋友,请略过,只是一点工作记录和心得,看您的需要决定是否要看,不需要的话,就忙自己的事。抱歉,偶尔写一点这些,它并没有什么重要性的需要强调的结果。无论做什么,只是在享受过程。感恩您的陪伴,晚安。
持续的专注状态下,今天终于把Dll的同步核心功能完成了,测试结果不错,给领导先看下,完成阶段性的验收。还需要多测试测试,检查下代码的严谨性。剩下的后端接口API和web前端的修改工作就相对容易了。中间遇到的困难也一一解决了。xmlquery包的使用在这个过程中学到了一个需求的场景的应用:查找并替换xml指定节点,并生成新的xml,用来辅助实现文件目录自动上传云盘的差异备份。
首先,任意查找一个节点去替换其中的某项元素,拼成某种格式去查,类似写sql语句,这点挺方便。
然后,过程中遇到了些问题:对于替换节点的操作,没有找到参考例子,就自己摸索。中间经历了些曲折:错误的修改了属性;明明替换了元素本身却没有看到预期的xml的变化,没有达到修改节点的元素值的目的。
xmlquery库包中现有的函数和属性中没找到直接修改节点的元素的操作,差点就要找找别的库看看了。
最后还是用xmlquery完成了处理。想到一种方法,试验后确实可以,思路是:把旧节点移除,构造新节点替换,但是移除前先找到其父节点,保存下,然后移除旧节点,将变更后的节点添加为父节点的子节点。
变更节点的方法:拿到节点的xml字符串,映射到结构体对象,修改结构体中要修改的项,再把修改后的结构体转xml,再生成新的节点。
另外,以上替换想要真实修改整个根xml节点有个前提条件是:找节点时得用的是Query函数找到节点指针,而不是Foreach中的回调函数参数中传过来的节点,虽然它看起来也是指针类型,但它只能满足数据访问,不能用它来当作节点本身去移除。这是遇到的其中一个问题时的发现:明明替换了,却发现修改不掉根xml,原因在这。
以上就完成了:对xml文件中按照想要的条件去查询,并修改指定节点,最后又得到一个变更后的xml的过程,完成xml的更新。
中间有些细节需要注意,比如,遇到从xml解析到的结构体,结果却不包含其数组子节点的问题。往结构体映射时,发现子节点弄丢了。原因在于,对节点调OutputXml时候,要传true,注意这个,估计它是带不带子节点的意思。
工作中的应用场景是,遍历本地文件生成新的xml结构与之前保存的旧的xml对比,得到那些需要重命名的资料夹或文件、新增的资料夹或文件,并把不变的资料夹和文件的Id和父Id从旧的xml读取,并填充到新的xml中。这样的话,比如,要新增资料夹或上传文件时,调接口就知道传什么父Id了。
旧的xml为什么有Id数据呢?
因为旧的xml中,保留了之前第一次从云端拿目录根节点的Id。并且,之后的每次调接口的操作,会返回云端的父目录Id以及目录/文件Id,把拿到的Id,填充到xml中。
因为,上传文件、创建目录、重命名的时候,父目录Id是必要传的值,所以这里先做初次的保留。后面进行和新生成的xml对比,实现差异更新。
然后,再把新的变成旧的,存储为xml文件,再进行下一轮检测对比,进行差异作业。实现本地目录文件备份云盘。
这是今天的分享。谢谢!感恩您!晚安。
![](https://img.haomeiwen.com/i27875653/3847acbf7988cf28.jpg)
网友评论