Преобразование одного XML-документа в другой XML-документ

Я хочу преобразовать 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 и т. Д. ... Или есть какой-то лучший, более удобный способ?


person Malik Daud Ahmad Khokhar    schedule 27.10.2008    source источник


Ответы (3)


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

Удачи!

person OJ.    schedule 27.10.2008
comment
Мы используем xmlspy, а в Visual Studio есть встроенный редактор. Я настоятельно рекомендую jenitennison.com/xslt и w3schools.com/xsl/xsl_languages.asp. - person Goran; 27.10.2008
comment
Руководство программиста XSLT Майкла Кея (Wrox Press) незаменимо. - person Robert Rossney; 27.10.2008
comment
Я подтверждаю: XSLT хорошо подходит для резюме. И это тоже очень удобно. - person Olivier 'Ölbaum' Scherler; 12.10.2011

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

person Rune Grimstad    schedule 27.10.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;
}
person Amy B    schedule 27.10.2008