Разделить XML-файл и сохранить информацию о родительском узле - PullRequest
2 голосов
/ 28 января 2011

В любом случае, с помощью LINQ, XmlDocument и т. Д. Я могу разбить большой xml-файл на более мелкие фрагменты и сохранить все значения родительского узла

Пример XML

<Inventory>
   <Dealer>
       <ID>123</ID>
       <Phone>1235551234</Phone>
       <Units>
          <Unit>
             <Year>
             <Make />
             <Model />
          </Unit>
          <Unit>
             <Year />
             <Make />
             <Model />
          </Unit>
      </Units>
  </Dealer>
   <Dealer>
       <ID>124</ID>
       <Phone>1235554321</Phone>
       <Units>
          <Unit>
             <Year />
             <Make />
             <Model />
          </Unit>
          <Unit>
             <Year />
             <Make />
             <Model />
          </Unit>
      </Units>
  </Dealer>
</Inventory>

Чанки должны выглядеть так для каждого узла Unit, найденного в исходном

<Inventory>
   <Dealer>
       <ID>123</ID>
       <Phone>1235551234</Phone>
       <Units>
          <Unit>
             <Year>
             <Make />
             <Model />
          </Unit>
       </Units>
  </Dealer>
</Inventory>

. Я должен прояснить одну проблему, я пытаюсь программно построить чанки, начиная с узла "Unit".без знания того, что может содержаться в родительских элементах.

Мое решение до сих пор -

XDocument document = XDocument.Load("sample.xml");
var units = document.Descendents("Unit").ToList();
foreach (XElement unit in units) 
{
    XElement parent = unit;
    XElement child  = parent;
    while (null != parent.Parent) 
    {
        parent = parent.Parent;
        parent.Descendents(child.Name).Remove();
        parent.Add(child);
        child = parent;
    }
} 

Это прекрасно работает для первой единицы в каждом узле дилера, каждой последующей единицыэтот дилер теряет родительскую информацию, а чанк содержит только узел Unit.

Ответы [ 2 ]

1 голос
/ 28 января 2011

Вы можете сделать это с помощью LINQ to XML + LINQ to Objects, для ясности я разделил решение на три части: сначала выбирая отдельные единицы, затем мутацию, затем порцию:

 //load test xml
XDocument doc = XDocument.Load(@"test.xml");

//select
var units = doc.Descendants("Unit")
               .Select(unit => new { Unit = unit, Dealer = unit.Parent.Parent })
               .ToList();

//mutate
units.ForEach(unit => 
              { 
                  unit.Dealer.Descendants("Unit").Remove(); 
                  unit.Dealer.Element("Units").Add(unit.Unit); 
              });

//Split into chunks
var chunks = units.Select( unit => new XDocument(new XElement("Inventory", unit.Dealer)))
                  .ToList();
0 голосов
/ 28 января 2011

Выберите узел (ы) с помощью метода selectSingleNode или selectNodes и удалите его из XML-документа.

...