Форум: "Начинающим";
Текущий архив: 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