Преобразование одного XML-документа в другой XML-документ - PullRequest
4 голосов
/ 27 октября 2008

Я хочу преобразовать документ XML, содержащий много элементов в узле (около 150), в другой документ XML с немного другой схемой, но в основном с теми же именами элементов. Теперь мне нужно вручную сопоставить каждый элемент / узел между двумя документами. Для этого мне придется жестко закодировать 150 строк сопоставления и имен элементов. Примерно так:

XElement newOrder = new XElement("Order");
newOrder.Add(new XElement("OrderId", (string)oldOrder.Element("OrderId")),
newOrder.Add(new XElement("OrderName", (string)oldOrder.Element("OrderName")),
...............
...............
...............and so on

Документ newOrder может содержать дополнительные узлы, которым будет присвоено значение null, если для них ничего не найдено в oldOrder. Так что у меня есть какой-то другой выбор, кроме как жестко закодировать 150 имен элементов, таких как orderId, orderName и т. Д. ... Или есть какой-то более удобный способ поддержки?

Ответы [ 3 ]

15 голосов
/ 27 октября 2008

Вместо этого используйте XSLT-преобразование . Вы можете использовать встроенный .NET XslCompiledTransform , чтобы выполнить преобразование. Спасает вас от необходимости набирать стеки кода. Если вы еще не знаете XSL / XSLT, то изучение его - это то, что принесет вам CV:)

Удачи!

1 голос
/ 27 октября 2008

XElement.Add имеет перегрузку , которая принимает объект [].

List<string> elementNames = GetElementNames();

newOrder.Add(
  elementNames
    .Select(name => GetElement(name, oldOrder))
    .Where(element => element != null)
    .ToArray()
  );

//

public XElement GetElement(string name, XElement source)
{
  XElement result = null;
  XElement original = source.Elements(name).FirstOrDefault();
  if (original != null)
  {
    result = new XElement(name, (string)original)
  }
  return result;
}
1 голос
/ 27 октября 2008

Используйте XSLT-преобразование для перевода вашего старого XML-документа в новый формат.

...