比较两个 xml 并使用 LINQ 打印差异

2023-11-23

我正在比较两个 xml,并且必须打印差异。我怎样才能使用 LINQ 来实现这一点。 我知道我可以使用 Microsoft 的 XML diff 补丁,但我更喜欢使用 LINQ 。如果你有任何其他想法我会实现

//第一个XML

<Books>
 <book>  
  <id="20504" image="C01" name="C# in Depth">
 </book>  
 <book> 
  <id="20505" image="C02" name="ASP.NET">
 </book> 
 <book> 
  <id="20506" image="C03" name="LINQ in Action ">
 </book> 
 <book> 
  <id="20507" image="C04" name="Architecting Applications">
 </book> 
</Books>

//第二个XML

<Books>
  <book> 
    <id="20504" image="C011" name="C# in Depth">
  </book>
  <book> 
    <id="20505" image="C02" name="ASP.NET 2.0">
  </book>
  <book> 
    <id="20506" image="C03" name="LINQ in Action ">
  </book>
  <book> 
    <id="20508" image="C04" name="Architecting Applications">
  </book>
</Books>

我想比较这两个 xml 并像这样打印结果。

Issued       Issue Type             IssueInFirst    IssueInSecond

1            image is different      C01              C011
2            name  is different      ASP.NET          ASP.NET 2.0
3            id  is different        20507            20508

这是解决方案:

//sanitised xmls:
string s1 = @"<Books>
                 <book id='20504' image='C01' name='C# in Depth'/>
                 <book id='20505' image='C02' name='ASP.NET'/>
                 <book id='20506' image='C03' name='LINQ in Action '/>
                 <book id='20507' image='C04' name='Architecting Applications'/>
                </Books>";
string s2 = @"<Books>
                  <book id='20504' image='C011' name='C# in Depth'/>
                  <book id='20505' image='C02' name='ASP.NET 2.0'/>
                  <book id='20506' image='C03' name='LINQ in Action '/>
                  <book id='20508' image='C04' name='Architecting Applications'/>
                </Books>";

XDocument xml1 = XDocument.Parse(s1);
XDocument xml2 = XDocument.Parse(s2);

//get cartesian product (i think)
var result1 =   from xmlBooks1 in xml1.Descendants("book")
                from xmlBooks2 in xml2.Descendants("book")
                select new { 
                            book1 = new {
                                        id=xmlBooks1.Attribute("id").Value,
                                        image=xmlBooks1.Attribute("image").Value,
                                        name=xmlBooks1.Attribute("name").Value
                                      }, 
                            book2 = new {
                                        id=xmlBooks2.Attribute("id").Value,
                                        image=xmlBooks2.Attribute("image").Value,
                                        name=xmlBooks2.Attribute("name").Value
                                      } 
                             };

//get every record that has at least one attribute the same, but not all
var result2 = from i in result1
                 where (i.book1.id == i.book2.id 
                        || i.book1.image == i.book2.image 
                        || i.book1.name == i.book2.name) &&
                        !(i.book1.id == i.book2.id 
                        && i.book1.image == i.book2.image 
                        && i.book1.name == i.book2.name) 
                 select i;



foreach (var aa in result2)
{
    //you do the output :D
}

两个 linq 语句可能可以合并,但我将其作为练习留给您。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

比较两个 xml 并使用 LINQ 打印差异 的相关文章

  • Dapper 强类型查询返回默认对象值

    刚刚开始使用 Dapper 并喜欢它 我遇到了问题 它返回正确数量的对象 但它们的属性都有默认值 using var dbConnection Connection await dbConnection OpenAsync const st
  • 警告:从指针目标类型中丢弃“const”限定符

    没有const char s意味着 s 是一个指向常量 char 的指针 那么为什么它给我这个警告 我并不是想改变价值观 在第一个函数中警告是return discards const qualifiers from pointer tar
  • boost::interprocess 准备好迎接黄金时间了吗? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在开发一个由内存映射文件支持的线
  • C/C++ 中随机数生成器的实现[重复]

    这个问题在这里已经有答案了 我对 C 中随机数生成器的实现有点困惑 它也与 C 中的明显不同 如果我理解正确 对 srand seed 的调用会以某种方式初始化可通过 rand 访问的隐藏变量 种子 该变量又将函数指向预先生成的序列 例如例
  • WPF - 按多列排序时使用自定义比较器

    我有一个 ListView GridView 我想按 2 列排序 因此如果第 1 列中有 2 个以上的项目具有相同的值 它将按第 2 列排序 非常简单 但是在对 A Z 进行排序时 空字符串会出现在顶部 我想把它们移到底部 我制作了一个比较
  • C++:获取注册表值仅给出第一个字符[重复]

    这个问题在这里已经有答案了 我试图从注册表中获取字符串值 但我只得到第一个字母 HKEY hKey char gamePath MAX PATH if RegOpenKeyEx HKEY CURRENT USER L Software Bl
  • 使用 QSet 作为 Qt 地图容器中的键

    我需要一个映射 其中键是唯一的 并且每个键都是一组或自定义 POD 结构 其中包含 3 个数据项 这些值只是指向对象实例的指针 从阅读Qt 的 QMap 与 QHash 的文档 http qt project org doc qt 4 8
  • 未定义异常变量时通过引用捕获

    捕获异常时 标准指导是按值抛出 按引用捕获 据我了解 这有两个原因 如果由于内存不足异常而引发异常 我们将不会调用可能终止程序的复制构造函数 如果异常是继承层次结构的一部分 我们可能会对异常进行对象切片 如果我们有一个场景 我们没有在 ca
  • initializer_list 和默认构造函数重载决策

    include
  • Windows 程序如何临时更改其时区?

    我写了一个函数来返回time t与给定日期的午夜相对应的值 当给定日期没有午夜时 它返回最早可用的时间 例如 当埃及进入夏令时时 这种情况就可能发生 今年 时间更改于 4 月 29 日晚上午夜生效 因此时钟直接从 23 59 转到 01 0
  • 首先EntityFramework数据库 - 类型映射 - 将binary(8)从SQL映射到C#中的int

    在 SQL 内部 我有一个主键为二进制 8 的表 当我使用该表添加到我的模型中时Update Model from Database我可以看到该列有 type Binary 在 C 中 我将该列设为byte 我可以将该列映射到 int 吗
  • ASP MVC 5 - 403 customError 不起作用

    我正在尝试为我的应用程序创建自定义错误页面 它在大部分情况下都有效 但不适用于403 errors 我的网络配置
  • 在非指针变量和类成员上放置 new

    考虑以下示例 include
  • 使用 cudamalloc()。为什么是双指针?

    我目前正在浏览有关的教程示例http code google com p stanford cs193g sp2010 http code google com p stanford cs193g sp2010 学习CUDA 演示的代码 g
  • ASP.NET Web API Swagger(Swashbuckle)重复OperationId

    I have a web api controller like below In swagger output I am having the below image And when I want to consume it in my
  • 如何使用eclipse构建C++应用程序

    我已经从以下位置下载了 Eclipse Juno for C here http www eclipse org downloads download php file technology epp downloads release ju
  • 获取大于某个数字的元素个数

    我正在尝试解决以下问题 数字被插入到容器中 每次插入数字时 我需要知道容器中有多少元素大于或等于当前插入的数字 我相信这两个操作都可以以对数复杂度完成 我的问题 C 库中有标准容器可以解决这个问题吗 我知道std multiset可以在对数
  • Visual Studio 2015默认附加库

    当我在 VS 2015 中创建一个空项目时 它会自动将这些库放入 附加依赖项 中 kernel32 lib user32 lib gdi32 lib winspool lib comdlg32 lib advapi32 lib shell3
  • Crypto++ 和压缩 EC 密钥

    如何在 Crypto 中生成压缩的 ECDSA 密钥 AutoSeededRandomPool prng ECDSA
  • 计算两个日期之间的工作日数?

    在C 中 如何计算business 或工作日 两个日期之间的天数 我以前曾经遇到过这样的任务 并且我已经找到了解决方案 当可以避免的时候 我会避免列举其间的所有日子 这里就是这种情况 正如我在上面的一个答案中看到的那样 我什至没有提到创建一

随机推荐

  • 如何在 Git 中合并子目录?

    是否可以仅将子目录的更改从本地 Git 分支合并到远程 Git 分支 还是 全有或全无 例如 我有 branch a content 1 dir 1 content 2 and branch b content 1 dir 1 conten
  • 如何使用 MS Visual Studio 进行 Android 开发?

    可以使用 Visual Studio 进行 Android 开发吗 如果是这样 您将如何设置 android SDK 而不是 NET Framework 是否有任何特殊设置或配置 是的 您可以使用 vs android 来使用 Visual
  • SpriteKit:如何创建基本物理关节

    我正在尝试在两个 SKPhysicsBodies 之间创建简单的关节 但是 他们的行为很奇怪 我很清楚锚点应该位于场景坐标上 请查看随附的源代码 例如 这就是在矩形上附加小正方形后固定关节的结果 void createFixedJointO
  • 如何获取 Select2 下拉列表中的所有值?

    我们如何获取 jQuery Select2 下拉插件中的所有元素 我已将 Select2 应用于输入类型 隐藏 然后使用 Ajax 填充它 现在 在一个实例中 我需要获取下拉列表中出现的所有值 这是一个输入字段
  • 视图绑定无权访问片段

    我有一个活动ConstraintLayout和它的片段
  • 如何在python2.7中使用cv2制作一个新的过滤器并将其应用到图像上?

    如何在python2 7中使用cv2制作一个新的过滤器并将其应用到图像上 例如 kernel np array 1 1 1 1 4 1 1 1 1 我是 opencv 的新手 所以如果你能解释一下那就太好了 谢谢 至于将自定义内核应用于给定
  • SessionState 和 ViewState 有什么区别?

    ASP NET 中的 SessionState 和 ViewState 有什么区别 会话状态包含与服务器的特定会话 由特定客户端 浏览器 计算机 相关的信息 这是一种跟踪用户在网站上所做的事情的方法 跨多个页面 在网络的无状态性中 例如特定
  • 联合和文本有什么区别?

    在 git repo 的根目录下有一个 gitattributes 文件 该文件包含以下值 txt text merge text py text merge union merge text 和 merge union 有什么区别 内置合
  • timepicker:何时选择 24 小时或上午/下午模式

    我的应用程序中有一些时间选择器 在我的国家 西班牙 我们习惯于以 24 小时模式显示时间 但在其他国家则习惯于 am pm 我知道如何将时间选择器设置为 24 点或上午 下午模式 但是根据设备区域设置或国家 地区显示上午 下午或 24 点的
  • 在 Azure Durable Functions Orchestrator 中使用异步辅助函数是否安全?

    我正在尝试偶尔寻找一些Non Deterministic workflow detected TaskScheduledEvent 0 TaskScheduled 我们的持久功能项目中出现错误 这种情况并不常见 大约 10 000 个实例中
  • 如何淡入/淡出矩形或文本?

    我想实现淡入 淡出矩形或文本的效果 我在 UIVIew 的 drawRect 方法中调用 CGContextFillRect 或 CGContextShowText 我想知道是否有一种方法可以在不使用 UIView 支持的情况下实现动画 即
  • .find() 比基本后代选择方法更快吗?

    滑轨 30 英寸保罗 爱尔兰的博客提及 container find div robotarm 比 container div robotarm 这是真的 也许在 jQuery 的早期版本中就是这种情况 然而 表达 container di
  • Hibernate 标准查询使用键字段上的 Max() 投影并按外键进行分组

    我很难将此查询 直接在数据库上工作 表示为 Hibernate 版本 3 2 5 中的条件查询 SELECT s FROM ftp status s WHERE s datetime s connectionid IN SELECT MAX
  • 在 WinSock 中处理异步套接字?

    我正在使用消息窗口和 WSAAsyncSelect 如何使用一个消息窗口跟踪多个套接字 客户端 Windows 支持多种套接字操作模式 您需要明确您正在使用哪一种 阻塞套接字 发送和接收块 非阻塞套接字 send和recv返回E WOULD
  • 如何在服务器端运行不受信任的代码?

    我试图使用沙盒模块在 linux node js 中运行不受信任的 javascript 代码 但它已损坏 我需要的只是让用户编写打印输出一些文本的 javascript 程序 不允许其他 I O 只使用普通的 javascript 没有其
  • javax.ejb.Singleton在集群环境下是如何单例的?

    我需要为集群环境中的所有用户和所有节点维护一个在应用程序中唯一的简单计数器 我考虑过使用单例会话 bean 注释 javax ejb Singleton 如下所示 package foo import javax ejb Singleton
  • 如何突出显示 Rails 验证错误上的字段

    如何在 Rails 3 1 中突出显示未通过验证错误的字段的表单字段 我知道脚手架会自动生成 css 和控制器代码来处理这个问题 但我想知道是否有办法手动生成 我已经通过以下方式实现了错误消息的字符串显示 user errors full
  • 如何在单个 for-eachin XSLT 中选择多个节点

    我正在尝试学习 XSLT 但通过示例效果最好 我想执行一个简单的模式到模式转换 如何仅通过一次传递来执行此转换 我当前的解决方案使用两次传递并丢失客户的原始订单 From
  • 如何使用 Java 中的流创建两个数组的映射?

    假设我有两个数组Double Double a new Double 1 2 3 Double b new Double 10 20 30 使用 Java 流 如何创建地图 Map
  • 比较两个 xml 并使用 LINQ 打印差异

    我正在比较两个 xml 并且必须打印差异 我怎样才能使用 LINQ 来实现这一点 我知道我可以使用 Microsoft 的 XML diff 补丁 但我更喜欢使用 LINQ 如果你有任何其他想法我会实现 第一个XML