Обновление XML с помощью XSLT в C # - Как обновить тот же файл - PullRequest
1 голос
/ 22 октября 2010

Мое требование - обновить файл XML (некоторые элементы, идентифицируемые с помощью параметра, с новыми значениями атрибута, снова идентифицируемыми с помощью параметра).

Я использую XSLT, чтобы сделать то же самое с помощью кода C #.

Мой код выглядит следующим образом:

XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(f_Xslt);
XmlReader xr = XmlReader.Create("SourceXML.xml");
XmlWriter xw = XmlWriter.Create("DestinationXML.xml");
XsltArgumentList argsList = new XsltArgumentList(); 
argsList.AddParam("", "", "");
...
...
...
xslt.Transform(xr, argsList, xw);

В моем XSLT-файле я сначала копирую все элементы, атрибуты.И затем, основываясь на <xsl:template match = ... />, я обновляю элементы attr / values.

Все это сохраняется в Destination.xml

Что если я хочу, чтобы все это происходило в самом Source.xml.

Конечно, самое простое решение (или мое решение на данный момент) - заменить Source.XML на Destination.XML после успешного завершения XSLT.Transform.

Ответы [ 2 ]

1 голос
/ 22 октября 2010

Никогда не пытайтесь обновить на месте с помощью XSLT . Это плохой дизайн и не в духе функционального языка.

При этом вы можете скопировать исходный XML-файл во временный каталог, а затем применить преобразование с экземпляром XmlWriter, созданным для перезаписи исходного файла.

Как я уже говорил, я бы не советовал!

1 голос
/ 22 октября 2010

Я думаю, что ваше решение «преобразовать в файл, а затем заменить» так же хорошо, как и вы.Вы не хотите перезаписывать файл Source.XML во время чтения, даже если .NET и ОС позволят вам.

Чтобы предложить лучшую альтернативу transform-to-file-then-replace(TTFTR), я хотел бы спросить, что в TTFTR, по вашему мнению, является неоптимальным?

Единственная альтернатива, которую я могу придумать, - записать результат вашего преобразования в память;и когда преобразование будет завершено, сохраните результат из памяти в исходный файл.Чтобы преобразовать в память, передайте объект MemoryStream в качестве аргумента XmlWriter.Create () .

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