【问题标题】:Compare elements from 2 xml's比较来自 2 个 xml 的元素
【发布时间】:2015-12-29 23:37:53
【问题描述】:

我目前正在从事一个项目,我每天从客户端获取一个 xml 文件,我需要从中读取数据并将其加载到数据库中。我实现这一点的方式是,我从 xsd 生成一个类,并使用 StreamReader 读取 xml 文件并反序列化数据,然后循环访问成员并将它们添加到数据库中。

现在,我有另一个要求,只有当成员详细信息与前一天的 xml 文件发生更改时,我才需要将成员添加到数据库中。我可以用相同的方式对其进行编码,并添加一个逻辑来搜索/比较成员详细信息与前一天的 xml 文件,并在发现任何更改时添加成员。

但是这个过程效率很低,因为我需要为新xml中的每个成员遍历前一天的xml。有没有有效的方法来实现这一点?

请提供您的建议。谢谢

【问题讨论】:

  • 您可以将今天的 xml 加载到数据库的“暂存”表中,并使用存储过程在数据库级别处理比较和更新。每天,清空“暂存”表并加载新的 xml,然后运行您的存储过程。
  • 我已经检查了该链接,并且比较输出与原始 xsd 不匹配..因此我将无法反序列化结果....msdn.microsoft.com/en-us/library/aa302294.aspx

标签: c# xml


【解决方案1】:

我建议不要通过之前的 xml 文件来比较值,而是在插入/更新命令中与 DB 进行比较。

IF(/* Check whether value changed code*/) BEGIN
    INSERT INTO ...
END

这样您就不必跟踪以前的 xml 文件等。

【讨论】:

  • 不,我不能使用数据库逻辑,因为来自 xml 的数据分布在不同的表中
  • 数据“分布在不同的表”不会妨碍您使用“数据库逻辑”。
  • 好吧,我之前在文件逻辑方面有过糟糕的经历。比如延迟获取文件、意外获取相同的文件,或者在数据提供者端的系统关闭后一次获取 10 个文件等。每个文件都是另一种情况,我建议依靠您保存的数据进行比较。如果您确实需要比较文件,我也去过那里:) 请您自己编写代码,因为有时 diff api 会告诉您一个值并且以下几个值被更改,但是您会看到插入了新节点而其他节点没有改变等等。
  • @DourHighArch 是的,它不会阻止我,但我担心从任何数据源(xml 或 db)多次读取会影响性能……而且我们每个周末都会清除数据.所以每个星期一都没有数据可以比较反对者
  • 我刚刚发现 xml 中有一个 LastModified 和 CreatedDateTime 字段。我计划从客户端获取有关这些字段的更多详细信息..如果它们打算正常工作..我可以使用这些字段并与 currentDateTime 进行比较...所有 LastModified 或 CreatedDateTime 等于 currentDatetime 的成员将是加载到数据库......这样我就不必与任何旧数据源进行比较
【解决方案2】:

这听起来像是您可以利用数据库的力量/资源并让它进行比较/更新/插入的情况。将您的每日文件加载到临时表中,并运行一个查询或存储过程来确定哪些记录需要更新,而不是尝试从 c# 进行这种比较。

您在之前的 cmets 中提到这是不可能的,因为数据分布在不同的表中。如果与该数据的比较过于复杂,那么您可以在临时表中保留 2 天的数据——使用日期时间戳来区分哪些记录集是“今天”,哪些是“昨天”。运行查询以识别相同与不同,并将结果返回到 c#,然后您可以在其中继续处理数据分发/更新的逻辑。

【讨论】:

    猜你喜欢
    • 2019-01-14
    • 2020-09-18
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多