【问题标题】:How can I find a good library to deal with XML in C# [closed]如何找到一个好的库来处理 C# 中的 XML [关闭]
【发布时间】:2013-11-21 12:08:37
【问题描述】:

我需要一个好的库来处理 XML - .NET 中的比较/差异。 我需要一个库来允许我与 xml 文件进行比较,然后将结果作为 XML 文件获取,仅包含差异: 示例:

XML1:

XML2:

那么结果应该是这样的: status="changed"/>

【问题讨论】:

  • 要求我们推荐或查找工具、库或最喜欢的非现场资源的问题对于 Stack Overflow 来说是题外话
  • buitin XmlReader 不足以满足您的需求吗?

标签: c# xml dll computer-science


【解决方案1】:

我建议将 2 个 xml 文件反序列化为 2 个对象并比较这 2 个对象以找出差异。 例如:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.IO;

namespace ConsoleApplication5 {
    class Program {
        static void Main(string[] args) {
            var xml1 = "<?xml version=\"1.0\" encoding=\"utf-8\" ?> <entity tag=\"gentype\" value=\"java\" />";
            var xml2 = "<?xml version=\"1.0\" encoding=\"utf-8\" ?> <entity tag=\"gentype\" value=\"c#\" />";

            var entity1 = DeserializeFrom(xml1);
            var entity2 = DeserializeFrom(xml2);

            if (entity1 != entity2) {
                entity1.Status = "changed";
            }

            var newxml = SerializeTo(entity1);
            Console.WriteLine(newxml);
            Console.Read();
        }

        static Entity DeserializeFrom(String xmlText) {
            var bytes = Encoding.UTF8.GetBytes(xmlText);
            using (var stream = new MemoryStream(bytes)) {
                var serializer = new XmlSerializer(typeof(Entity));
                return (Entity)serializer.Deserialize(stream);
            }
        }

        static String SerializeTo(Entity entity) {
            var bytes = new byte[1024];
            using (var stream = new MemoryStream(bytes)) {
                var serializer = new XmlSerializer(typeof(Entity));
                serializer.Serialize(stream, entity);
            }
            return Encoding.UTF8.GetString(bytes);
        }


    }

    [XmlRoot("entity")]
    public class Entity {
        [XmlAttribute("tag")]
        public String Tag { get; set; }

        [XmlAttribute("value")]
        public String Value { get; set; }

        [XmlAttribute("status")]
        public String Status { get; set; }

        public override bool Equals(object obj) {
            var entity = (Entity)obj;
            return this.Tag == entity.Tag && this.Value == entity.Value;
        }
    }
} 

【讨论】:

  • 你怎么能更精确!?
  • 请看我上面的更新答案。
猜你喜欢
  • 2011-11-13
  • 2010-09-08
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 2012-08-22
  • 1970-01-01
  • 2016-02-09
相关资源
最近更新 更多