Главная страница
    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.003 c
15-1301054149
TUser
2011-03-25 14:55
2011.07.10
Тут, кстати, 150 лет электромагнетизму ...


3-1261512342
XeON
2009-12-22 23:05
2011.07.10
SQLite3 без "врапперов"


15-1300719280
mahab-22
2011-03-21 17:54
2011.07.10
работа с dbexpress


15-1301290908
OW
2011-03-28 09:41
2011.07.10
Поиск по строке аля посковика. Генераторы запроса.


10-1175362315
Qds
2007-03-31 21:31
2011.07.10
Таймаут в DCom





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский