1

このような 2 つの XML があります。

XML1

<RPM>
  <CAI ID="101" Name="Guaranteed Payments"/>
  <CAI ID="102" Name="Sports Recreation"/> 
</RPM>

XML2

<RPM>
  <CAI ID="102" Active="False"/>
  <CAI ID="103" Active="True"/> 
</RPM>

CAI ID に基づいて、2 つの XML の属性を 1 つにマージする C# コードを作成する必要があります。たとえば、両方の XML に CAI ID 102 のノードがあるため、最終的な XML は次のようになります。

結果

    <RPM>
       <CAI ID="101" Name="Guaranteed Payments"/>
       <CAI ID="102" Name="Sports Recreation" Active="False"/>
       <CAI ID="103" Active="True"/>
    </RPM>
4

2 に答える 2

2

このようなことをして、両方の XML ファイルをクラスにデシリアライズしてから、それらをコードで結合したくなるでしょう。

したがって、XML 定義クラスは、必要な最終製品になります。

[XmlTypeAttribute]
[XmlRootAttribute("RPM")]
public class RPMConfiguration
{

    [XmlElementAttribute("CAI")]
    public CAI[] CAIList{ get; set; }


}

[XmlTypeAttribute]
public class CAI
{
    [XmlAttributeAttribute("ID")]
    public int ID { get; set; }

    [XmlAttributeAttribute("Name")]
    public string Name { get; set; }

    [XmlAttributeAttribute("Active")]
    public string Active{ get; set; }
}

次に、次のように xml 文字列を逆シリアル化します。

public static object Deserialize(string xml)
{
    var deserializer = new System.Xml.Serialization.XmlSerializer(typeof(RPMConfiguration));
    using (var reader = XmlReader.Create(new StringReader(xml)))
    {
        return (RPMConfiguration)deserializer.Deserialize(reader);
    }
}

この時点で、CAI オブジェクトのリストを含む 2 つの RPMConfiguration オブジェクトができます。これらをループして ID を照合し、1 つをマスター コレクションとして扱い、欠落している属性をそこにコピーします。

終わったら。構成を XML にシリアル化するだけで、1 つの完全な XML ファイルになります。

于 2012-05-01T10:05:34.957 に答える
0
string xml1 = @"
    <RPM>
        <CAI ID=""101"" Name=""Guaranteed Payments""/>
        <CAI ID=""102"" Name=""Sports Recreation""/> 
    </RPM>";

string xml2 = @"
    <RPM>
        <CAI ID=""102"" Active=""False""/>
        <CAI ID=""103"" Active=""True""/> 
    </RPM>";

XDocument xDoc1 = XDocument.Load(new StringReader(xml1));
XDocument xDoc2 = XDocument.Load(new StringReader(xml2));
var cais = xDoc1.Descendants("CAI")
          .Concat(xDoc2.Descendants("CAI"))
          .GroupBy(x => x.Attribute("ID").Value)
          .Select(x => x.SelectMany(y => y.Attributes()).DistinctBy(a => a.Name))
          .Select(x => new XElement("CAI", x));

string xml = new XElement("RPM", cais).ToString();

ここでDistinctByJon Skeet による完全な実装を見つけることができます

public static partial class MyExtensions
{
    public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> source, Func<T, TKey> keySelector)
    {
        HashSet<TKey> knownKeys = new HashSet<TKey>();
        foreach (T element in source)
        {
            if (knownKeys.Add(keySelector(element)))
            {
                yield return element;
            }
        }
    }
}
于 2012-05-01T14:15:03.077 に答える