- 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# чуть получше, но в целом тоже жуткое мракобесие. 
Сил больше нет работать с подобным, увольняюсь и ищу норм работу.
        
        
and we need to go deeper
Хороший заголовок цикла.
То, что в Дельфи работает оптимально, в крестах создаёт переголовы.
этот язык называется МыПишемНаБорланд
IXML - очевидно, очередное их гениальное творение
в нормальных парсерах перебрать дочерние элементы можно легко и просто
а в борланд метод NextSibling() возвращает не NULL, если соседи закончились, а raises an exception
это пиздец
Ну мудаки... Нарушают не писанное правило: "Не используй исключения в частых не исключительных ситуациях".
Хотя, конечно, лучшеб итератор использовали.
function TXMLNode.PreviousSibling: IXMLNode;
begin
if Assigned(ParentNode) then
Result := ParentNode.ChildNodes.FindSibling(Self as IXMLNode, -1) else
Result := nil;
end;