Как объединить два xml файла, если API не совпадает в обоих файлах, используя c#? - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть 2 xml файлов с именами xml1 и xml2.Если номер API в обоих xml совпадает, дочерние узлы xml2 должны быть добавлены в xml1 для этого номера API. Это должно происходить для нескольких API в обоих * Файл 1010 *, если сопоставление имеет место. Помощь PLZ. Файл xml выглядит следующим образом:

xml1

<WellBore>
    <APINumber>42001321910000</APINumber>
      <WBRoot>
      <RrcTapeRecordId>0</RrcTapeRecordId>      
      <WbNxtAvailSuffix>00</WbNxtAvailSuffix>    
</WellBore>
<WellBore>
    <APINumber>42001313220000</APINumber>
      <WBRoot>
      <RrcTapeRecordId>0</RrcTapeRecordId>    
</WellBore>

xml2
<DrillingPermit>
    <APINumber>42001321910000</APINumber>
 <DARoot>
      <RrcTapeRecordId>0</RrcTapeRecordId>
      <DAStatusNumber>854731</DAStatusNumber>
</DARoot>
</DrillingPermit>
<DrillingPermit>
    <APINumber>42008167810000</APINumber>
 <DARoot>
      <RrcTapeRecordId>0</RrcTapeRecordId>
      <DAStatusNumber>854731</DAStatusNumber>
</DARoot>
</DrillingPermit>

Result should be in xml1 as
<WellBore>
    <APINumber>42001321910000</APINumber>
      <WBRoot>
      <RrcTapeRecordId>0</RrcTapeRecordId>      
      <WbNxtAvailSuffix>00</WbNxtAvailSuffix>    
</WellBore>
<DrillingPermit>
    <APINumber>42001321910000</APINumber>
 <DARoot>
      <RrcTapeRecordId>0</RrcTapeRecordId>
      <DAStatusNumber>854731</DAStatusNumber>
</DARoot>
</DrillingPermit>
<DrillingPermit>
<WellBore>
    <APINumber>42001313220000</APINumber>
      <WBRoot>
      <RrcTapeRecordId>0</RrcTapeRecordId>    
</WellBore>

РЕДАКТИРОВАТЬ: Добавлено в вопрос согласно комментарию ниже:

XDocument xml1 = XDocument.Load(@"C:\Official\Projects\xmltransform\xmltransform\TXRRC.xml"); 
XDocument xml2 = XDocument.Load(@"C:\Official\Projects\xmltransform\xmltransform\Drilling.xml"); 
XElement txrrc1 = xml1.Descendants().Descendants("WellBore").FirstOrDefault(); 
XElement drill1 = xml2.Descendants().Descendants("DrillingPermit").FirstOrDefault(); 

if(txrrc1.Element("APINumber").Value == drill1.Element("APINumber").Value) 
{ 
    txrrc1.Add(drill1.Nodes()); 
}

1 Ответ

0 голосов
/ 18 февраля 2020

Попробуйте следующее:

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 INPUT_FILENAME1 = @"c:\temp\test.xml";
        const string INPUT_FILENAME2 = @"c:\temp\test1.xml";
        const string OUTPUT_FILENAME = @"c:\temp\test2.xml";
        static void Main(string[] args)
        {
            XDocument doc1 = XDocument.Load(INPUT_FILENAME1);
            XDocument doc2 = XDocument.Load(INPUT_FILENAME2);

            var compareItems = (from bore in doc1.Descendants("WellBore")
                           join permit in doc2.Descendants("DrillingPermit") on (string)bore.Element("APINumber") equals (string)permit.Element("APINumber")
                               select new { bore = bore, permit = permit}).ToList();

            foreach (var compareItem in compareItems)
            {
                compareItem.bore.AddAfterSelf(compareItem.permit);
            }
            doc1.Save(OUTPUT_FILENAME);
        }

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...