Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.07.10;
Скачать: CL | DM;

Вниз

что не так с кодом   Найти похожие ветки 

 
student1991   (2011-03-31 16:07) [0]

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

Дан 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:10) [1]

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


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

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


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

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

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


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

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2011.07.10;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.008 c
15-1300433835
И. Павел
2011-03-18 10:37
2011.07.10
Покупка нового домашнего компьютера


15-1301148266
Учусь
2011-03-26 17:04
2011.07.10
[Fatal Error] Internal error: BC2241


15-1300489436
KilkennyCat
2011-03-19 02:03
2011.07.10
Самый дешевый кпк на win ce


10-1175061542
ustas
2007-03-28 09:59
2011.07.10
InternetExplorer.Application link Click


3-1261385211
Rhododendrom
2009-12-21 11:46
2011.07.10
BackUp/Restore базы данных FireBird из моей программы.