[fpc-pascal] fcl-xml

2013-03-12 Thread dev . dliw
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

2013-03-12 Thread Michael Van Canneyt



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

2013-03-12 Thread Mattias Gaertner
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

2013-03-12 Thread Mattias Gaertner
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

2013-03-12 Thread Michael Van Canneyt



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

2013-03-12 Thread dev . dliw
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

2013-03-12 Thread Mattias Gaertner
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

2013-03-12 Thread dev . dliw
 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

2013-03-12 Thread dev . dliw
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

2013-03-12 Thread Daniel Gaspary
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

2013-03-12 Thread Daniel Gaspary
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

2013-03-12 Thread dev . dliw
  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

2013-03-12 Thread Michael Van Canneyt



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

2013-03-12 Thread dev . dliw
  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