(Linq To) XML добавляет все элементы в пути, которые не существуют - PullRequest
0 голосов
/ 27 ноября 2010

У меня есть схема XML, которая выглядит следующим образом:

<InnerNodeType1 Name="...">
 <InnerNodeType2 Name="...">
  <Leaf ID="..." />
 </InnerNodeType2>
</InnerNodeType1>

InnerNodeType1 и InnerNodeType2 могут быть вложены как:

<InnerNodeType1 Name="...">
 <InnerNodeType1 Name="...">
  <InnerNodeType1 Name="...">
   <InnerNodeType2 Name="...">
    <Leaf ID="..." />
   </InnerNodeType2 Name="...">
  </InnerNodeType1>
 </InnerNodeType1>
</InnerNodeType1>

Что держит всегда:

  • На пути есть хотя бы один InnerNodeType1
  • На пути есть хотя бы один InnerNodeType2
  • InnerNodeType2 имеет один и только один LeafNode
  • Есть только 2 типа внутренних узлов

В основном это путь как: InnerNodeType1\...\InnerNodeType1\InnerNodeType2\...\InnerNodeType2\Leaf.

Учитывая 3 строки, содержащие: путь для InnerNodeType1, путь для InnerNodeType2 и лист, я хочу добавить в файл XML элементы, которые отсутствуют. Если какая-то часть пути уже существует, просто добавьте новые элементы в качестве дочерних узлов.

Как я могу сделать это, используя C # и (Linq to) XML?

Спасибо

1 Ответ

1 голос
/ 28 ноября 2010

Вы просто хотите добавить узлы элементов, заданные в путях? Если я вас правильно понимаю, вы можете сделать это следующим образом:

class Program
{
    static void Main(string[] args)
    {
        XDocument doc = new XDocument();
        Add(doc, @"root\cont1", "cont2", "leaf");
        Add(doc.Root, @"cont1\cont1", "cont2", "leaf");
        Add(doc.Root, "cont1", "cont2", "leaf");
        Add(doc.Root, @"cont1\cont1\cont1\cont1", @"cont2\cont2", "leaf");

        doc.Save(Console.Out);
    }
    static void Add(XContainer cont, string path1, string path2, string path3)
    {
        Add(cont, path1 + "\\" + path2 + "\\" + path3);
    }

    static void Add(XContainer cont, string path)
    {
        Add(cont, path.Split('\\'));
    }

    private static void Add(XContainer cont, IEnumerable<string> names)
    {
        XName name = names.FirstOrDefault();
        if (name == null)
        {
            return;
        }
        XContainer child = cont.Element(name);
        if (child == null)
        {
            child = new XElement(name);
            cont.Add(child);
        }
        Add(child, names.Skip(1));
    }
}

Это выводит следующий XML:

<root>
  <cont1>
    <cont2>
      <leaf />
    </cont2>
    <cont1>
      <cont2>
        <leaf />
      </cont2>
      <cont1>
        <cont1>
          <cont2>
            <cont2>
              <leaf />
            </cont2>
          </cont2>
        </cont1>
      </cont1>
    </cont1>
  </cont1>
</root>

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

...