簡體   English   中英

使用linq將具有重復元素的基於另一個xml的一個xml更新為xml

[英]update one xml based on another xml with repetitive elements with linq to xml

我有一個源XML:

<Source>
    <First>
        <Name>Name1</Name>
    </First>
    <First>
        <Name>Name2</Name>
    </First>
</Source>

我有一個空的目標xml,我要在其中復制源xml中的數據。

空目標xml是:

<Target>
    <Second>
        <FirstName></FirstName>
    </Second>
    <Second>
        <FirstName></FirstName>
    </Second>
</Target>

復制后,目標xml將如下所示:

<Target>
    <Second>
        <FirstName>Name1</FirstName>
    </Second>
    <Second>
        <FirstName>Name2</FirstName>
    </Second>
</Target>

我正在尋找一個簡單的linq to xml解決方案。 問題是,我不知道如何基於源xml中的重復元素來更新目標xml中的重復元素。

謝謝。

您可以使用以下代碼進行操作:

var source = "<Source><First><Name>Name1</Name></First><First><Name>Name2</Name></First></Source>";
var sourceDocument = XDocument.Load(new StringReader(source));

var target = "<Target><Second><FirstName></FirstName></Second><Second><FirstName></FirstName></Second></Target>";
var targetDocument = XDocument.Load(new StringReader(target));

var sourceNameElements = sourceDocument.Descendants("First").Select(first => first.Element("Name")).ToList();
var targetNamesElements = targetDocument.Descendants("Second").Select(second => second.Element("FirstName")).ToList();

for (var i = 0; i < sourceNameElements.Count; ++i)
{
    targetNamesElements[i].SetValue(sourceNameElements[i].Value);
}

Console.WriteLine(targetDocument.ToString());

我不知道解決此問題的最簡單方法,這是我能想到的最好方法,您必須確保Name.count大於FirstName.count:

        var sourceXml =XElement.Parse(source);
        var targetXml = XElement.Parse(target);
        var i = 0;
        var nameArray = (from name in sourceXml.Descendants("Name")
            select  name.Value).ToArray();
        foreach (var fName in targetXml.Descendants("FirstName"))
        {
            fName.Value = nameArray[i++];
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM