- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
void CXMLParser::Parse(std::map< std::pair<int, int>, int >& link)
{
_di_IXMLNode areaNode = MessageNode->ChildNodes->FindNode( WideString("area") );
if( areaNode )
{
Area.reset( new CAreaPart( areaNode ) );
IXMLNodeList* pointList = areaNode->ChildNodes;
if( pointList )
{
for(int pointIndex=0; pointIndex<pointList->GetCount(); pointIndex++)
{
_di_IXMLNode pointNode = pointList->Get( pointIndex );
int typePoint = -1;
if( pointNode->GetNodeName() == WideString("measuringpoint") )
typePoint = MEASURING;
if( pointNode->GetNodeName() == WideString("accountpoint") )
typePoint = ACCOUNT;
if( pointNode->GetNodeName() == WideString("deliverypoint") )
typePoint = DELIVERY;
switch( typePoint )
{
case MEASURING:
case ACCOUNT:
case DELIVERY:
{
const int pointCode = pointNode->GetAttribute( WideString("code") );
const String pointName = pointNode->GetAttribute( WideString("name") );
IXMLNodeList* channelList = pointNode->ChildNodes;
if( channelList )
{
for(int channelIndex=0; channelIndex<channelList->GetCount(); channelIndex++)
{
_di_IXMLNode channelNode = channelList->Get( channelIndex );
if( channelNode->GetNodeName() == WideString("measuringchannel") )
{
const int channelCode = channelNode->GetAttribute( WideString("code") );
const String channelDesc = channelNode->GetAttribute( WideString("desc") );
IXMLNodeList* periodList = channelNode->ChildNodes;
if( periodList )
{
for(int periodIndex=0; periodIndex<periodList->GetCount(); periodIndex++)
{
_di_IXMLNode periodNode = periodList->Get( periodIndex );
if( periodNode )
{
String str = periodNode->GetAttribute( WideString("start") );
periodNode->GetAttribute( WideString("end") );
TDateTime time;
time = TDateTime( StrToInt( str.SubString( 1, 2 ) ), StrToInt( str.SubString( 3, 2 ) ), 0, 0 );
periodNode->GetAttribute( WideString("summer") );
time = IncMinute( time, 30 );
_di_IXMLNode valueNode = periodNode->ChildNodes->FindNode( WideString("value") );
if( valueNode )
{
const int status = valueNode->GetAttribute( WideString("status") );
const int value = StrToInt( valueNode->Text );
if( RTDBWrite )
{
map< pair<int, int>, int >::iterator i = link.find( make_pair( pointCode, channelCode ) );
if( i!=link.end() )
{
(*RTDBWrite)( Date->DateInterval.first + time, (*i).second, value, status );
}
}
}
}
}
}
}
}
}
}
}
}
}
}
RTDBWrite->Flush();
}
Древний legacy-код на БорландЦэпэпэБыдлере, обнаруживаемый на текущей работе (почти госпредприятие), выглядит в основной своей массе примерно так. Новый код на C# чуть получше, но в целом тоже жуткое мракобесие.
Сил больше нет работать с подобным, увольняюсь и ищу норм работу.
defecate-plusplus 15.02.2012 10:32 # +2
and we need to go deeper
TarasB 15.02.2012 12:07 # −1
Хороший заголовок цикла.
То, что в Дельфи работает оптимально, в крестах создаёт переголовы.
roman-kashitsyn 15.02.2012 12:28 # +1
defecate-plusplus 15.02.2012 12:42 # −1
этот язык называется МыПишемНаБорланд
IXML - очевидно, очередное их гениальное творение
в нормальных парсерах перебрать дочерние элементы можно легко и просто
а в борланд метод NextSibling() возвращает не NULL, если соседи закончились, а raises an exception
это пиздец
Говногость 15.02.2012 15:10 # +2
Ну мудаки... Нарушают не писанное правило: "Не используй исключения в частых не исключительных ситуациях".
Хотя, конечно, лучшеб итератор использовали.
d_dev 16.02.2012 08:12 # 0
function TXMLNode.PreviousSibling: IXMLNode;
begin
if Assigned(ParentNode) then
Result := ParentNode.ChildNodes.FindSibling(Self as IXMLNode, -1) else
Result := nil;
end;
defecate-plusplus 16.02.2012 09:15 # +2
d_dev 17.02.2012 14:13 # 0
guest8 09.04.2019 12:41 # −999