Xml объединить с использованием C# - PullRequest
0 голосов
/ 11 июля 2020
xml1:
<value>
    <Id>1</id>
    <name>AAA</name>
</value>
<value>
    <Id>2</id>
    <name>bbb</name>
</value>
<value>
    <Id>3</id>
    <name>ccc</name>
</value>

xml2:

<value>
<Id>1</id>
<Company>abc</Company>
<address>ASD</address>
</value>

result :
    <value>
        <Id>1</id>
        <name>AAA</name>
        <Company>abc</Company>
        <address>ASD</address>
    </value>
    <value>
        <Id>2</id>
        <name>bbb</name>
    </value>
    <value>
        <Id>3</id>
        <name>ccc</name>
    </value>

если id 1-го xml = 2-го xml, тогда объедините вторую xml запись с 1-й xml записью значения. В моем коде я не проверял значения идентификаторов, но я пытался объединить вторую запись xml вместе с root с записью 1 xml. будет здорово, если ты мне поможешь. Я получаю сообщение об ошибке. Вставляемый узел взят из другого контекста документа.

 XmlNode x1 = doc1.SelectSingleNode("/OutLooksync/value");
            foreach (XmlNode node in x1.SelectNodes("/OutLooksync/value"))
            {
                x1.AppendChild(doc2.ImportNode(node, true));

            }
 

Ответы [ 3 ]

1 голос
/ 11 июля 2020

Используя XmlDocument,

  • , вы можете l oop в значениях в xml1 и в значениях в xml2
  • Проверить, равно ли id, и импортировать childNodes из xml2

1 - Xml для теста:

string xml1 = @"
    <OutLooksync>
        <value>
            <id>1</id>
            <name>AAA</name>
        </value>
        <value>
            <id>2</id>
            <name>bbb</name>
        </value>
        <value>
            <id>3</id>
            <name>ccc</name>
        </value>
    </OutLooksync>";

string xml2 = @"
    <OutLooksync>
        <value>
            <id>1</id>
            <Company>abc</Company>
            <address>ASD</address>
        </value>
    </OutLooksync>";

2 - код для импорта узлов

XmlDocument xmlDocument1 = new XmlDocument();
xmlDocument1.LoadXml(xml1);

XmlDocument xmlDocument2 = new XmlDocument();
xmlDocument2.LoadXml(xml2);

XmlNodeList values1 = xmlDocument1.SelectNodes("/OutLooksync/value");
XmlNodeList values2 = xmlDocument2.SelectNodes("/OutLooksync/value");

foreach(XmlNode value1 in values1)
{
    foreach(XmlNode value2 in values2)
    {
        if(value1.SelectSingleNode("./id").InnerText != value2.SelectSingleNode("./id")?.InnerText)
        {
            continue;
        }
        
        foreach(XmlNode toImport in value2.ChildNodes)
        {
            if (toImport.Name == "id")
                continue;

            value1.AppendChild(xmlDocument1.ImportNode(toImport, true));
        }
    }
}

Console.WriteLine(xmlDocument1.InnerXml);

Надеюсь, вы найдете это полезным.

1 голос
/ 11 июля 2020

            string xml1 = @"
    <OutLooksync>
        <value>
            <id>1</id>
            <name>AAA</name>
        </value>
        <value>
            <id>2</id>
            <name>bbb</name>
        </value>
        <value>
            <id>3</id>
            <name>ccc</name>
        </value>
    </OutLooksync>";

            string xml2 = @"
    <OutLooksync>
        <value>
            <id>4</id>
            <Company>abc</Company>
            <address>ASD</address>
        </value>
    </OutLooksync>";
            XmlDocument doc1 = new XmlDocument();
            doc1.LoadXml(xml1);

            XmlDocument doc2 = new XmlDocument();
            doc2.LoadXml(xml2);
            XmlNode newvalue = doc1.ImportNode(doc2.DocumentElement.FirstChild, true);
            doc1.DocumentElement.AppendChild(newvalue);
0 голосов
/ 11 июля 2020

XmlNodeList x1 = doc1.SelectSingleNodes("/OutLooksync/value");
    foreach (XmlNode node in x1)
        {
            doc2.appendChild(node);

         }
...