Как переформатировать XML программно? - PullRequest
4 голосов
/ 29 ноября 2010

У меня есть XML-документ на входе, который ужасно отформатирован (это файл проекта Delphi, если кому-то интересно) - несовместимые отступы, пустые строки, строки узлов, соединенные вместе:

<BorlandProject><Delphi.Personality><Parameters><Parameters Name="HostApplication">C:\Some\Path\Filename.exe</Parameters> <!--etc--> <Excluded_Packages>


</Excluded_Packages>

Я хочу переформатировать егово что-то хорошее.Какой самый простой способ сделать это программно, с Win32 / COM?Если MSXML, как мне это сделать?

Я бы тоже хотел указать единицу отступа (табуляция / несколько пробелов).

Я попытался использовать оболочку MSXML от Delphi TXmlDocument и этодействительно удаляет пустые строки и отступы узлов с вкладками, но не разделяет строки, подобные этой:

<BorlandProject><Delphi.Personality><Parameters><Parameters Name="HostApplication">C:\Some\Path\Filename.exe</Parameters> <!--etc--> <Excluded_Packages>

Ответы [ 2 ]

19 голосов
/ 29 ноября 2010

Я протестировал функцию FormatXMLData в файле проекта delphi и работает нормально, правильно сделайте отступ всех строк.

проверьте этот код.

uses
 XMLIntf,
 XMLDoc;

Procedure FormatXMLFile(const XmlFile:string);
var
   oXml : IXMLDocument;
 begin
   oXml := TXMLDocument.Create(nil);
   oXml.LoadFromFile(XmlFile);
   oXml.XML.Text:=xmlDoc.FormatXMLData(oXml.XML.Text);
   oXml.Active := true;
   oXml.SaveToFile(XmlFile);
 end;
0 голосов
/ 13 апреля 2018

Я использовал Tidy для форматирования XML.Метод RRUZ, использующий xmlDoc. FormatXMLData, работает очень хорошо, и имеет смысл использовать его, но если ваши файлы XML оказываются большими, то это может работать не так хорошо.Когда я попытался отформатировать однострочный XML-файл размером 100 МБ, приложение завершилось с ошибкой нехватки памяти на компьютере с 4 ГБ, и это тоже было очень медленно.

Я использовал командную строкуверсия приборки.Существует также версия DLL, и есть файл заголовка Delphi, который вы можете выследить, но я нашел более удобным запускать exe через CreateProcess, а не изучать API DLL.

ЭтоКомандная строка, которую я использовал:

tidy.exe -xml -wrap 0 -indent -quiet -o outFile.xml inFile.xml

tidy.exe является автономным, вам не нужна DLL или что-либо еще.

Другими возможностями форматирования XML являются xmllint и xml starlet.

Я вообще не смог запустить xmllint, но я уверен, что смог бы, если бы настаивал.

xml starlet, казалось, работал хорошо, но у него не было никакой возможности записать в файл, только в stdout, поэтому я не использовал это, потому что мне пришлось бы придумать, как захватитьвыход.

...