400
400
%% +type valid_contents([rule()],[xmlElement()])->
401
401
%% [xmlElement() | {error,???}.
402
valid_contents(Rule,XMLS,Rules,S,WSActionMode)->
403
case parse(Rule,XMLS,Rules,WSActionMode,S) of
405
lists:flatten(XML_N);
406
{_,[#xmlElement{name=Name}|_T]} ->
407
exit({error,{element,Name,isnt_comprise_in_the_rule,Rule}});
408
{_,[#xmlText{}=Txt|_T]} ->
409
exit({error,{element,text,Txt,isnt_comprise_in_the_rule,Rule}});
402
valid_contents(Rule, XMLS, Rules, S, WSActionMode)->
403
case parse(Rule, XMLS, Rules, WSActionMode, S) of
406
{error, Reason, N} ->
408
{XML_N, Rest} -> %The list may consist of xmlComment{} records
409
case lists:dropwhile(fun(X) when is_record(X, xmlComment) -> true; (_) -> false end, Rest) of
411
lists:flatten(XML_N);
412
[#xmlElement{name=Name} |_T] ->
413
exit({error, {element, Name, isnt_comprise_in_the_rule, Rule}});
414
[#xmlText{} = Txt |_T] ->
415
exit({error, {element, text, Txt, isnt_comprise_in_the_rule, Rule}})
416
parse({'*',SubRule},XMLS,Rules,WSaction,S)->
417
star(SubRule,XMLS,Rules,WSaction,[],S);
418
parse({'+',SubRule},XMLS,Rules,WSaction,S) ->
419
plus(SubRule,XMLS,Rules,WSaction,S);
420
parse({choice,CHOICE},XMLS,Rules,WSaction,S)->
419
parse({'*', SubRule}, XMLS, Rules, WSaction, S)->
420
star(SubRule, XMLS, Rules, WSaction, [], S);
421
parse({'+',SubRule}, XMLS, Rules, WSaction, S) ->
422
plus(SubRule, XMLS, Rules, WSaction, S);
423
parse({choice,CHOICE}, XMLS, Rules, WSaction, S)->
423
426
% io:format("~p~n",[{choice,CHOICE,[]}]);
426
429
% [#xmlText{value=V}|_] ->
427
430
% io:format("~p~n",[{choice,CHOICE,{text,V}}])
429
choice(CHOICE,XMLS,Rules,WSaction,S);
430
parse(empty,[],_Rules,_WSaction,_S) ->
432
parse({'?',SubRule},XMLS,Rules,_WSaction,S)->
433
question(SubRule,XMLS,Rules,S);
434
parse({seq,List},XMLS,Rules,WSaction,S) ->
435
seq(List,XMLS,Rules,WSaction,S);
436
parse(El_Name,[#xmlElement{name=El_Name}=XML|T],Rules,_WSaction,S)
432
choice(CHOICE, XMLS, Rules, WSaction, S);
433
parse(empty, [], _Rules, _WSaction, _S) ->
435
parse({'?', SubRule}, XMLS, Rules, _WSaction, S)->
436
question(SubRule, XMLS, Rules, S);
437
parse({seq,List}, XMLS, Rules, WSaction, S) ->
438
seq(List, XMLS, Rules, WSaction, S);
439
parse(El_Name, [#xmlElement{name=El_Name} = XML |T], Rules, _WSaction, S)
437
440
when is_atom(El_Name)->
438
case do_validation(read_rules(Rules,El_Name),XML,Rules,S) of
441
case do_validation(read_rules(Rules, El_Name), XML, Rules, S) of
448
parse(any,Cont,Rules,_WSaction,S) ->
449
case catch parse_any(Cont,Rules,S) of
450
Err = {error,_} -> Err;
451
ValidContents -> {ValidContents,[]}
453
parse(El_Name,[#xmlElement{name=Name}|_T]=S,_Rules,_WSa,_S) when is_atom(El_Name)->
451
parse(any, Cont, Rules, _WSaction, S) ->
452
case catch parse_any(Cont, Rules, S) of
453
Err = {error, _} -> Err;
454
ValidContents -> {ValidContents, []}
456
parse(El_Name, [#xmlElement{name=Name} |_T] = XMLS, _Rules, _WSa, _S) when is_atom(El_Name) ->
455
{element_seq_not_conform,{wait,El_Name},{is,Name}},
456
{{next,S},{act,[]}} };
457
parse(_El_Name,[#xmlPI{}=H|T],_Rules,_WSa,_S) ->
459
parse('#PCDATA',XML,_Rules,_WSa,_S)->
458
{element_seq_not_conform,{wait, El_Name}, {is, Name}},
459
{{next, XMLS}, {act, []}}};
460
parse(El_Name, [#xmlComment{} |T], Rules, WSa, S) ->
461
parse(El_Name, T, Rules, WSa, S);
462
parse(_El_Name, [#xmlPI{} = H |T], _Rules, _WSa, _S) ->
464
parse('#PCDATA', XMLS, _Rules, _WSa, _S)->
460
465
%%% PCDATA it is 0 , 1 or more #xmlText{}.
462
parse(El_Name,[#xmlText{}|_T]=S,_Rules,_WSa,_S)->
467
parse(El_Name, [#xmlText{}|_T] = XMLS, _Rules, _WSa, _S)->
464
{text_in_place_of,El_Name},
465
{{next,S},{act,[]}}};
468
parse(Rule,[],_,_,_) ->
469
{error,{no_xml_element,Rule}}.
469
{text_in_place_of, El_Name},
470
{{next, XMLS}, {act, []}}};
471
parse([], _, _, _, _) ->
473
parse(Rule, [], _, _, _) ->
474
{error, {no_xml_element, Rule}}.
471
476
parse_any([],_Rules,_S) ->