Browse Source

Refactoring, no functional changes

xmlread.pp:
* Moved assignment of TXMLFileInputSource.SystemID into TXMLInputFileSource.Create.
* Eliminated nested procedure in TXMLReader.ProcessDefaultAttributes, it was redundant since
  r12026.

xpath.pp:
* Moved predicate evaluation code, which is common for filter and step nodes, into
  TXPathExprNode.EvalPredicate().

git-svn-id: trunk@13056 -
sergei 16 years ago
parent
commit
841625e3dd
2 changed files with 32 additions and 46 deletions
  1. 6 16
      packages/fcl-xml/src/xmlread.pp
  2. 26 30
      packages/fcl-xml/src/xpath.pp

+ 6 - 16
packages/fcl-xml/src/xmlread.pp

@@ -409,7 +409,7 @@ type
     procedure ParseElementDecl;
     procedure ParseNotationDecl;
     function ResolveEntity(const SystemID, PublicID: WideString; out Source: TXMLCharSource): Boolean;
-    procedure ProcessDefaultAttributes(Element: TDOMElement; ElDef: TDOMElementDef);
+    procedure ProcessDefaultAttributes(Element: TDOMElement; Map: TDOMNamedNodeMap);
 
     procedure PushVC(aElDef: TDOMElementDef);
     procedure PopVC;
@@ -1097,6 +1097,7 @@ end;
 constructor TXMLFileInputSource.Create(var AFile: Text);
 begin
   FFile := @AFile;
+  SystemID := FilenameToURI(TTextRec(AFile).Name);
   FetchData;
 end;
 
@@ -2888,7 +2889,8 @@ begin
   end;
   ExpectChar('>');
 
-  ProcessDefaultAttributes(NewElem, ElDef);
+  if Assigned(ElDef) and Assigned(ElDef.FAttributes) then
+    ProcessDefaultAttributes(NewElem, ElDef.FAttributes);
   PushVC(ElDef);  // this increases FNesting
 
   // SAX: ContentHandler.StartElement(...)
@@ -3035,18 +3037,12 @@ begin
   ClearRefs(FIDRefs);
 end;
 
-procedure TXMLReader.ProcessDefaultAttributes(Element: TDOMElement; ElDef: TDOMElementDef);
-var
-  Map: TDOMNamedNodeMap;
-  Attr: TDOMAttr;
-
-procedure DoDefaulting;
+procedure TXMLReader.ProcessDefaultAttributes(Element: TDOMElement; Map: TDOMNamedNodeMap);
 var
   I: Integer;
   AttDef: TDOMAttrDef;
+  Attr: TDOMAttr;
 begin
-  Map := ElDef.FAttributes;
-
   for I := 0 to Map.Length-1 do
   begin
     AttDef := Map[I] as TDOMAttrDef;
@@ -3067,11 +3063,6 @@ begin
   end;
 end;
 
-begin
-  if Assigned(ElDef) and Assigned(ElDef.FAttributes) then
-    DoDefaulting;
-end;
-
 function TXMLReader.ParseExternalID(out SysID, PubID: WideString;     // [75]
   SysIdOptional: Boolean): Boolean;
 begin
@@ -3511,7 +3502,6 @@ var
 begin
   ADoc := nil;
   Src := TXMLFileInputSource.Create(f);
-  Src.SystemID := FilenameToURI(TTextRec(f).Name);
   Reader := TXMLReader.Create;
   try
     Reader.ProcessXML(Src);

+ 26 - 30
packages/fcl-xml/src/xpath.pp

@@ -100,6 +100,9 @@ type
 { XPath expression parse tree }
 
   TXPathExprNode = class
+  protected
+    function EvalPredicate(AContext: TXPathContext;
+      AEnvironment: TXPathEnvironment; APosition: Integer): Boolean;
   public
     function Evaluate(AContext: TXPathContext;
       AEnvironment: TXPathEnvironment): TXPathVariable; virtual; abstract;
@@ -567,6 +570,22 @@ end;
 
 { XPath parse tree classes }
 
+function TXPathExprNode.EvalPredicate(AContext: TXPathContext;
+  AEnvironment: TXPathEnvironment; APosition: Integer): Boolean;
+var
+  resvar: TXPathVariable;
+begin
+  resvar := Evaluate(AContext, AEnvironment);
+  try
+    if resvar.InheritsFrom(TXPathNumberVariable) then
+      Result := resvar.AsNumber = APosition + 1   // TODO: trunc/round?
+    else
+      Result := resvar.AsBoolean;
+  finally
+    resvar.Release;
+  end;
+end;
+
 constructor TXPathConstantNode.Create(AValue: TXPathVariable);
 begin
   inherited Create;
@@ -973,7 +992,7 @@ end;
 function TXPathFilterNode.Evaluate(AContext: TXPathContext;
   AEnvironment: TXPathEnvironment): TXPathVariable;
 var
-  ExprResult, PredicateResult: TXPathVariable;
+  ExprResult: TXPathVariable;
   NodeSet, NewNodeSet: TNodeSet;
   i, j: Integer;
   CurContextNode: TDOMNode;
@@ -995,24 +1014,10 @@ begin
         DoAdd := True;
         for j := 0 to FPredicates.Count - 1 do
         begin
-          PredicateResult := TXPathExprNode(FPredicates[j]).Evaluate(NewContext,
-            AEnvironment);
-          try
-            if PredicateResult.InheritsFrom(TXPathNumberVariable) then
-            begin
-              if PredicateResult.AsNumber <> i + 1 then
-              begin
-                DoAdd := False;
-                break;
-              end;
-            end else if not PredicateResult.AsBoolean then
-            begin
-              DoAdd := False;
-              break;
-            end;
-          finally
-            PredicateResult.Release;
-          end;
+          DoAdd := TXPathExprNode(FPredicates[j]).EvalPredicate(NewContext,
+            AEnvironment, i);
+          if not DoAdd then
+            Break;
         end;
         if DoAdd then
           NewNodeSet.Add(CurContextNode);
@@ -1108,7 +1113,6 @@ var
     NewContext: TXPathContext;
     NewStepNodes: TNodeSet;
     Predicate: TXPathExprNode;
-    PredicateResult: TXPathVariable;
     TempList: TList;
 
   begin
@@ -1241,16 +1245,8 @@ var
           Node := TDOMNode(StepNodes[j]);
           NewContext.ContextNode := Node;
           Inc(NewContext.ContextPosition);
-          PredicateResult := Predicate.Evaluate(NewContext, AEnvironment);
-          try
-            if (PredicateResult.InheritsFrom(TXPathNumberVariable) and
-              (PredicateResult.AsNumber = j + 1)) or
-              (not PredicateResult.InheritsFrom(TXPathNumberVariable) and
-               PredicateResult.AsBoolean) then
-                NewStepNodes.Add(Node);
-          finally
-            PredicateResult.Release;
-          end;
+          if Predicate.EvalPredicate(NewContext, AEnvironment, j) then
+            NewStepNodes.Add(Node);
         end;
       finally
         NewContext.Free;