Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.07.10;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.002 c
2-1301601969
Cyberkazi
2011-04-01 00:06
2011.07.10
Отправка почты!


2-1301910488
@!!ex
2011-04-04 13:48
2011.07.10
Проверка целостности и распаковка ZIP файла


2-1301506475
Учусь
2011-03-30 21:34
2011.07.10
Как обновить отображение компонента на форме?


2-1301402564
Eugene1501
2011-03-29 16:42
2011.07.10
Что значит подобная конструкция


15-1298116193
И. Павел
2011-02-19 14:49
2011.07.10
Упрощение установки Delphi на новый компьютер





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский