Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

что не так с кодом


student1991 ©   (2011-03-31 16:07:00) 

В контрольной было задание:

Дан XML-файл следующего содержания:

<Node>
<SubNode11 A = "" />
<SubNode12  />
<SubNode21 A = "" />
<Subnode22  />
       <Subnode22  />
       <Subnode11 A = "" />
       ....................
</Node>

Нужно написать процедуру, которая бы проверяла:

- наличие в узлах SubNode11, SubNode21 атрибута A, если не найден - raise Exception
- отсутствие в узлах SubNode12, SubNode22 атрибута A, если найден - raise Exception

Сделал так:

препод сказал, что код слишком грязно написан, разъясните, что тут не так.


resourcestring
 EFileNotFound = 'Файл "%s" не найден';
 EAttrRequired = 'Атрибут не найден';
 EInvalidAttr  = 'Недопустимый атрибут';

const
 CAttrAttrName  = 'Attr';

 CSubNode11Name = 'SubNode11';
 CSubNode12Name = 'SubNode12';
 CSubNode21Name = 'SubNode21';
 CSubNode22Name = 'SubNode22';

procedure CheckWorkXML(const FileName: string);
var
 attr_a: IXMLDOMNode;
 B: Boolean;
 I: Integer;
 WorkXML: IXMLDOMDocument;
begin
 WorkXML := CoDOMDocument.Create;
 if not WorkXML.load(FileName) then
   raise Exception.CreateResFmt(@EFileNotFound, [FileName]);
 with WorkXML.documentElement do
   for I := 0 to childNodes.length - 1 do
     with childNodes[I], attributes do
     begin
       B := SameText(nodeName, CSubNode11Name) or
         SameText(nodeName, CSubNode21Name);
       attr_a := getNamedItem(CAttrAttrName);
       if attr_a = nil then
       begin
         if B then
           raise Exception.CreateResFmt(@EAttrRequired,
             [CAttrAttrName]);
       end
       else
         if not B then
           raise Exception.CreateResFmt(@EInvalidAttr,
             [CAttrAttrName]);
     end;
end;


Медвежонок Пятачок   (2011-03-31 16:37:00) [1]

а где в задании сказано, что надо знать в каком именно ноде ошибка.

там сказано, что если найдены определенные ноды с атрибутом А, то генерить исключение.
или если найдены определенные ноды без атрибута А, то тоже генерить исключение.

PS тем более, что все "кривые" ноды будут лежать в списке на блюдечке с каемочкой.


student1991   (2011-03-31 16:32:00) [2]

действительно все сократилось, спасибо.

В продолжение вопроса, а если, например, нужно проверять несколько атрибутов (от 5 и больше) и выводить имя атрибута при проверке которого произошла ошибка, может будет правильнее делать проверку для каждого нода в цикле? где-то слышал, что selectSingleNode/selectNodes поочередно перебирает все ноды в которых происходит поиск. получается одни и те же ноды будут перебиратся несколько раз, к тому же как я узнаю, при проверке какого атрибута произошла ошибка.


Медвежонок ХМЛ   (2011-03-31 16:21:00) [3]

if WorkXML.selectNodes('//SubNode11[not(@A)]').length > 0 then Raise ....
if WorkXML.selectNodes('//SubNode12[@A]').length > 0 then Raise ....


Медвежонок Пятачок   (2011-03-31 16:10:00) [4]

то что весь этот ужас проверок можно  заменить двумя строчками с selectnodes.


Наверх

Титульная страница Поиск, карта сайта Написать письмо