[fpc-pascal] fcl-xml
Hi, working with fcl-xml some questions came together. Every hint is appreciated. 1. No matter what I do and which (short valid) xml file I use - getElementById is always nil (tested with trunk and latest stable 2.6.2) and the same applies to TXMLDocument.IDs. I tried with ReadXMLFile and TDOMParser with different options - but the result is always the same. Is getElementById supposed to work properly or is it something that needs to be implemented? Trying to understand what the parser does (not that easy), I got the feeling that no Hashtable for the IDs is created - can someone with more insight comment on that? 2. Is there a way to tell WriteXMLFile *not* to use indentation? 3. What is the state of XPath? The readme says 'Should be fairly completed' - can I assume it works for simple tasks? Many thanks for any hint, d.l.i.w ___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Re: [fpc-pascal] fcl-xml
On Tue, 12 Mar 2013, dev.d...@gmail.com wrote: Hi, working with fcl-xml some questions came together. Every hint is appreciated. 1. No matter what I do and which (short valid) xml file I use - getElementById is always nil (tested with trunk and latest stable 2.6.2) and the same applies to TXMLDocument.IDs. I tried with ReadXMLFile and TDOMParser with different options - but the result is always the same. Is getElementById supposed to work properly or is it something that needs to be implemented? Trying to understand what the parser does (not that easy), I got the feeling that no Hashtable for the IDs is created - can someone with more insight comment on that? It should be filled ? The XMLTextReader creates the map, and passes it on to the final document. 2. Is there a way to tell WriteXMLFile *not* to use indentation? No. 3. What is the state of XPath? The readme says 'Should be fairly completed' - can I assume it works for simple tasks? This I do not know. Michael. ___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Re: [fpc-pascal] fcl-xml
On Tue, 12 Mar 2013 10:39:35 +0100 dev.d...@gmail.com wrote: Hi, working with fcl-xml some questions came together. Every hint is appreciated. 1. No matter what I do and which (short valid) xml file I use - getElementById is always nil (tested with trunk and latest stable 2.6.2) and the same applies to TXMLDocument.IDs. I tried with ReadXMLFile and TDOMParser with different options - but the result is always the same. Is getElementById supposed to work properly or is it something that needs to be implemented? Trying to understand what the parser does (not that easy), I got the feeling that no Hashtable for the IDs is created - can someone with more insight comment on that? It seems to be started, but not finished. I have not written it, just looked at the implementation. 2. Is there a way to tell WriteXMLFile *not* to use indentation? No. 3. What is the state of XPath? The readme says 'Should be fairly completed' - can I assume it works for simple tasks? Yes. Mattias ___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Re: [fpc-pascal] fcl-xml
On Tue, 12 Mar 2013 11:52:06 +0100 (CET) Michael Van Canneyt mich...@freepascal.org wrote: [...] Is getElementById supposed to work properly or is it something that needs to be implemented? Trying to understand what the parser does (not that easy), I got the feeling that no Hashtable for the IDs is created - can someone with more insight comment on that? It should be filled ? The XMLTextReader creates the map, and passes it on to the final document. Normally getElementById should work in the DOM, not only when reading a xml document. Mattias ___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Re: [fpc-pascal] fcl-xml
On Tue, 12 Mar 2013, Mattias Gaertner wrote: On Tue, 12 Mar 2013 11:52:06 +0100 (CET) Michael Van Canneyt mich...@freepascal.org wrote: [...] Is getElementById supposed to work properly or is it something that needs to be implemented? Trying to understand what the parser does (not that easy), I got the feeling that no Hashtable for the IDs is created - can someone with more insight comment on that? It should be filled ? The XMLTextReader creates the map, and passes it on to the final document. Normally getElementById should work in the DOM, not only when reading a xml document. Correct, but since OP was using the read methods, it should work ? Michael. ___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Re: [fpc-pascal] fcl-xml
Hi, The XMLTextReader creates the map, and passes it on to the final document. // Trunk procedure TLoader.ProcessXML(ADoc: TDOMDocument; AReader: TXMLTextReader); begin [...] doc.IDs := reader.IDMap; reader.IDMap := nil; end; // 2.6.2 === snip === doc.IDs := FIDMap; FIDMap := nil; == Just rechecked again... The debugger clearly says, that reader.IDMap / FIDMap is nil... [Before the second assignement - of course :) ] It seems to be started, but not finished. If so, what needs to be done? Regards, d.l.i.w ___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Re: [fpc-pascal] fcl-xml
On Tue, 12 Mar 2013 12:21:10 +0100 dev.d...@gmail.com wrote: [...] Just rechecked again... The debugger clearly says, that reader.IDMap / FIDMap is nil... [Before the second assignement - of course :) ] It seems to be started, but not finished. If so, what needs to be done? Maybe the bug is that it checks case sensitive: procedure TXMLTextReader.ParseAttlistDecl; ... Found := FSource.Matches(AttrDataTypeNames[dt]); ... function TXMLCharSource.Matches(const arg: WideString): Boolean; begin Result := False; if (FBufEnd = FBuf + Length(arg)) or Reload then Result := CompareMem(Pointer(arg), FBuf, Length(arg)*sizeof(WideChar)); if Result then begin Inc(FBuf, Length(arg)); if FBuf = FBufEnd then Reload; end; end; Mattias ___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Re: [fpc-pascal] fcl-xml
Maybe the bug is that it checks case sensitive: procedure TXMLTextReader.ParseAttlistDecl; ... Found := FSource.Matches(AttrDataTypeNames[dt]); ParseAttlistDecl isn't called a single time... - to me it sounds like Parse Attribute *declaration* - and I don't have a DTD (the file is actually HTML). When switching Validate *on*, there are lot of DoError calls - but don't know if this is related... From what I see: (trunk) AddId is only called from ValidateAttrValue ValidateAttrValue is only called from ValidateCurrentNode and this is only when the parser does validation... For me there is missing something in ParseAttribute(ElDef: TElementDecl); === if Assigned(ElDef) then begin AttDef := ElDef.GetAttrDef(attrName); // mark attribute as specified if Assigned(AttDef) then FAttrDefIndex[AttDef.Index] := FAttrTag; end else AttDef := nil; === ElDef is not assigned, so AttDef is nil... AttDef holds TAttrDataType which should be recognised as dtId... I hope I got it right so far - but still don't know what the actual problem is... - That't what I'm currently testing with: === test.xml === ?xml version=1.0 encoding=UTF-8? html div id=testTest/div /html === test.pas === program test; {$mode objfpc}{$H+} Uses Classes, XMLRead, DOM; Var Doc : TXMLDocument; Parser : TDOMParser; Source : TXMLInputSource; List : TStringList; begin List := TStringList.Create; List.LoadFromFile('test.xml'); Parser := TDOMParser.Create; try Parser.Options.IgnoreComments := true; //Parser.Options.Validate := true; Source := TXMLInputSource.Create(List.Text); try Parser.Parse(Source, Doc); finally Source.Free; end; finally Parser.Free; end; WriteLn(assigned(Doc.IDs)); // output: false List.Free; end. == ___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Re: [fpc-pascal] fcl-xml
A little side note to my statement: and I don't have a DTD In this case the behaviour of the parser is even right... W3C: Note: Attributes with the name ID or id are not of type ID unless so defined -- http://stackoverflow.com/questions/3423430/java-xml-dom-how-are-id-attributes-special But that's not the solution to my problem... :( d.l.i.w ___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Re: [fpc-pascal] fcl-xml
Using Xpath I believe would be something like this: function ElementById(id: string; doc: TXMLDocument): TDOMElement; var v: TXPathVariable; begin result:=nil; try v:=EvaluateXPathExpression('//*[@id=' + QuotedStr(id)+']', doc.DocumentElement); result:=TDOMElement(v.AsNodeSet[0]); finally FreeAndNil(v); end; end; On Tue, Mar 12, 2013 at 10:42 AM, dev.d...@gmail.com wrote: A little side note to my statement: and I don't have a DTD In this case the behaviour of the parser is even right... W3C: Note: Attributes with the name ID or id are not of type ID unless so defined -- http://stackoverflow.com/questions/3423430/java-xml-dom-how-are-id-attributes-special But that's not the solution to my problem... :( d.l.i.w ___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal ___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Re: [fpc-pascal] fcl-xml
On Tue, Mar 12, 2013 at 11:17 AM, Daniel Gaspary dgasp...@gmail.com wrote: Using Xpath I believe would be something like this: I was missing an If: function ElementById(id: string; doc: TXMLDocument): TDOMElement; var v: TXPathVariable; begin result:=nil; try v:=EvaluateXPathExpression('//*[@id=' + QuotedStr(id)+']', doc.DocumentElement); with v.AsNodeSet do begin if Count0 then result:=TDOMElement(Items[0]); end; finally FreeAndNil(v); end; end; ___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Re: [fpc-pascal] fcl-xml
Using Xpath I believe would be something like this: I was missing an If: function ElementById(id: string; doc: TXMLDocument): TDOMElement; var v: TXPathVariable; begin [..] end; This does indeed work - thank you :) It's an acceptable solution for me, as I will need XPath anyway. Still I think that TDOMDocument.getElementById is better performance-wise - and I don't see a reason why it shouldn't work if TDOMDocument is created by the XMLParser - even if no definition is given... Is this worth a feature request / bug on mantis? d.l.i.w ___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Re: [fpc-pascal] fcl-xml
On Tue, 12 Mar 2013, dev.d...@gmail.com wrote: Using Xpath I believe would be something like this: I was missing an If: function ElementById(id: string; doc: TXMLDocument): TDOMElement; var v: TXPathVariable; begin [..] end; This does indeed work - thank you :) It's an acceptable solution for me, as I will need XPath anyway. Still I think that TDOMDocument.getElementById is better performance-wise - and I don't see a reason why it shouldn't work if TDOMDocument is created by the XMLParser - even if no definition is given... Is this worth a feature request / bug on mantis? Yes. Michael. ___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Re: [fpc-pascal] fcl-xml
Is this worth a feature request / bug on mantis? Yes. Issue #24032 ___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal