【问题标题】:C# XML Edit and Add from another xmlC# XML 从另一个 xml 编辑和添加
【发布时间】:2019-09-02 10:53:48
【问题描述】:

我都想在 C# 中加载并比较条目,如果它们不存在则添加它们,但不应添加某些异常。

我搜索了类似的问题,但找不到解决问题的方法。

Modify XML existing content in C#

How to change XML Attribute

//NEW
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <file-manager>
    <part-programs>
      <mount-points>
        <mount-point alias="USB (E:)">E:\</mount-point>
      </mount-points>
    </part-programs>
    <cad-parts>
      <mount-points>
        <mount-point alias="Part Programs">C:\Messer\Partprogram</mount-point>
      </mount-points>
    </cad-parts>
</configuration>

//OLD
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <file-manager>
    <part-programs>
      <mount-points>
        <mount-point alias="Floppy (A:)">A:\</mount-point>
        <mount-point alias="USB (E:)">E:\</mount-point>
        <mount-point alias="USB (F:)">F:\</mount-point>
        <mount-point alias="Part Programs">C:\Messer\Partprogram</mount-point>
        <mount-point alias="Programas">C:\Messer\ProgramasMaq2</mount-point>
      </mount-points>
    </part-programs>
    <cad-parts>
      <mount-points>
        <mount-point alias="Floppy (A:)">A:\</mount-point>
        <mount-point alias="USB (E:)">E:\</mount-point>
        <mount-point alias="USB (F:)">F:\</mount-point>
        <mount-point alias="Part Programs">C:\Messer\Partprogram</mount-point>
      </mount-points>
    </cad-parts>
</configuration>

//Should be added to NEW one

      <mount-points>
        <mount-point alias="USB (F:)">F:\</mount-point>
        <mount-point alias="Part Programs">C:\Messer\Partprogram</mount-point>
        <mount-point alias="Programas">C:\Messer\ProgramasMaq2</mount-point>
      </mount-points>

    <cad-parts>
      <mount-points>
        <mount-point alias="USB (E:)">E:\</mount-point>
        <mount-point alias="USB (F:)">F:\</mount-point>
      </mount-points>
    </cad-parts>


//Should not be added

      <mount-points>
        <mount-point alias="Floppy (A:)">A:\</mount-point>
      </mount-points>

    <cad-parts>
      <mount-points>
        <mount-point alias="Floppy (A:)">A:\</mount-point>
      </mount-points>
    </cad-parts>

【问题讨论】:

  • 如果我理解您的问题,您想读取和解析两个 XML 文件,在一个中查找不在另一个中的条目,添加它们并再次写出。这为您提供了几个定义明确的步骤,每个步骤都很容易搜索。尝试编写一些代码,如果您遇到困难,请向我们展示您所拥有的,并清楚地解释为什么它没有达到您的预期。然后我们可以给出更具体的指导。就您的问题而言,它并没有显示出人们回答的足够努力。

标签: c# xml edit xml.modify


【解决方案1】:

使用联接和左外部联接将起作用

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

namespace ConsoleApplication1
{
    class Program
    {
        const string NEW_FILENAME = @"c:\temp\test.xml";
        const string OLD_FILENAME = @"c:\temp\test1.xml";
        static void Main(string[] args)
        {
            XDocument newDoc = XDocument.Load(NEW_FILENAME);
            XDocument oldDoc = XDocument.Load(OLD_FILENAME);

            var query = (from oD in oldDoc.Descendants("file-manager").Elements()
                         join nD in newDoc.Descendants("file-manager").Elements() on oD.Name.LocalName equals nD.Name.LocalName
                         select new { name =  oD.Name.LocalName, oldDoc = oD, newDoc = nD })
                         .ToList();

            foreach (var part in query)
            {
                //left outer join
                var q = (from oldPart in part.oldDoc.Descendants("mount-point")
                         join newPart in part.newDoc.Descendants("mount-point") on (string)oldPart.Attribute("alias") equals (string)newPart.Attribute("alias") into ps
                         from newPart in ps.DefaultIfEmpty()
                         select new { newPart = newPart, oldPart = oldPart })
                        .ToList();

                XElement newMountPoint = part.newDoc.Descendants("mount-points").FirstOrDefault(); 

                foreach (var point in q)
                {
                    if (point.newPart == null)
                    {
                        newMountPoint.Add(point.oldPart);
                    }
                }
            }

        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多