2018-03-03 11:15 GMT+01:00 Michael Van Canneyt via Lazarus :
Show quoted text 46 lines
Hello,
The package .lpk andproject .lpi file use the following format :
<Units Count="241">
<Unit0>
<Filename Value="lazarus.pp"/>
<IsPartOfProject Value="True"/>
<UnitName Value="Lazarus"/>
</Unit0>
<Unit1>
<Filename Value="frames/oi_options.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="OIOptionsFrame"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Frame"/>
</Unit1>
And similarly
<RequiredPackages Count="7">
<Item1>
<PackageName Value="LazDebuggerGdbmi"/>
</Item1>
<Item2>
<PackageName Value="LCLBase"/>
<MinVersion Major="1" Release="1" Valid="True"/>
</Item2>
Is it possible to get rid of the counts ?
Reason: if 2 people add files to a package/project, it always creates
conflicts when updating from the VCS. And if you're in bad luck, you need to
change a lot of items.
On the other hand, if you do
<RequiredPackages>
<Package name="LazDebuggerGdbmi"/>
<Package name="LCLBase">
<MinVersion Major="1" Release="1" Valid="True"/>
</Package>
The chance of conflicts becomes less, and the resolution easier.
I am guessing the Count="xxx" attribute, and the numeric suffixes to <Unit1> , <Item1> are there to read and write these files using TXMLConfig class. Using TXMLConfig exposes an easy API to work with XML files, but it limits what you can do --- all the children nodes within the same parent must have a different name, so that you can do
File1 := XmlConfig.GetValue('Units /Unit1/FileName/Value');
File2 := XmlConfig.GetValue('Units /Unit2/FileName/Value'); ....
In Castle Game Engine, we added some extensions to TXMLConfig, in particular TCastleConfig.PathElement to address exactly this. It extracts a DOM element (TDOMElement) from TXMLConfig, and then you can use full power of the DOM unit to operate on this element (iterate on children etc.):
https://github.com/castle-engine/castle-engine/blob/master/src/files/castlexmlconfig.pas#L258 . This way you can still use TXMLConfig API (GetValue / SetValue) for some tasks, but you can switch to using more powerful DOM API for other tasks.
I thought maybe this is helpful :)
Regards,
Michalis