[Delphi\XML]XML bestand bij errors on-the-fly aanpassen

Pagina: 1
Acties:

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 08:07
Ik gebruik Delphi voor het openen/bewerken van een extern gedownload bestand. Dit bestand ziet er ongeveer zo uit: (header+1 record+footer):
XML:
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0"?>
<loc version="1.0" src="GeoBuddy">
  <waypoint>
    <name id="svarmor"><![CDATA[svärmör (mother in law)]]></name>
    <coord lat="52.12395" lon="5.989783"/>
    <type>geocache</type>
    <subtype>traditional</subtype>
    <link text="Cache Details">http://www.geocaching.nu/cachedetails.jsp?cache=116</link>
  </waypoint>
</loc>
Bij dit bestand hoort geen XSD ofzo.

Via de XML Data Binding wizard heb ik alle interfaces laten genereren, waaronder:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{ IXMLLocType }

  IXMLLocType = interface(IXMLNodeCollection)
    ['{F8D2F1EC-C2C9-4285-AD37-A11D789480B0}']
    { Property Accessors }
    function Get_Version: WideString;
    function Get_Src: WideString;
    function Get_Waypoint(Index: Integer): IXMLWaypointType;
    procedure Set_Version(Value: WideString);
    procedure Set_Src(Value: WideString);
    { Methods & Properties }
    function Add: IXMLWaypointType;
    function Insert(const Index: Integer): IXMLWaypointType;
    property Version: WideString read Get_Version write Set_Version;
    property Src: WideString read Get_Src write Set_Src;
    property Waypoint[Index: Integer]: IXMLWaypointType read Get_Waypoint; default;
  end;


Via de volgende code open ik het bestand voor bewerking:
Delphi:
1
2
3
4
5
6
7
8
9
procedure LeesLOC(Bestand:string);
var
  LOCfile:IXMLLOCtype;
begin
  LOCfile:=LoadLOC(Bestand);

  [...knip]

end;


Het resultaat is dan:
code:
1
2
3
4
5
Project Project1.exe raised exception class EDOMParseError with
message 'An invalid charcter was found in text content.

Line: 4
<name id="svarmor"<!CDATA[sv'.


De error kan ik met try..except wel afvangen, maar ik wil dan ter plekke de verbetering maken, dus het probleem-karakter vervangen door &#x[hex]; zodat hij wel door de parser wordt geaccepteerd. Via Google en Got-search kom ik alleen de mogelijkheden tegen om de fout af te vangen, niet om de fout pro-actief(mode-woord) te verbeteren in de juiste code.

  • mindcrash
  • Registratie: April 2002
  • Laatst online: 22-11-2019

mindcrash

Rebellious Monkey

XML parsers vinden speciale karakters niet leuk. Je zal karakters als ä, é, ë enzovoorts moeten converteren naar entities.

"The people who are crazy enough to think they could change the world, are the ones who do." -- Steve Jobs (1955-2011) , Aaron Swartz (1986-2013)


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 23-05 23:27

Tomatoman

Fulltime prutser

mindcrash schreef op 25 april 2004 @ 15:32:
XML parsers vinden speciale karakters niet leuk. Je zal karakters als ä, é, ë enzovoorts moeten converteren naar entities.
mindcrash schreef op 25 april 2004 @ 15:32:
XML parsers vinden speciale karakters niet leuk. Je zal karakters als ä, é, ë enzovoorts moeten converteren naar entities.
Dat hangt er maar net vanaf welke codering je kiest. Meestal wordt UTF-8-codering gebruikt, dat speciale karakters niet pruimt. Als je een andere codering gebruikt, is het probleem waarschijnlijk verholpen. De codering staat bovenaan in het document.
XML:
1
2
3
4
<?xml version="1.0" encoding="UTF-8" ?> 
<loc version="1.0" src="GeoBuddy">
  <waypoint>
    ...

[ Voor 11% gewijzigd door Tomatoman op 25-04-2004 20:18 ]

Een goede grap mag vrienden kosten.


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 08:07
tomatoman schreef op 25 april 2004 @ 16:28:
Dat hangt er maar net vanaf welke codering je kiest. Meestal wordt UTF-8-codering gebruikt, dat speciale karakters niet pruimt. Als je een andere codering gebruikt, is het probleem waarschijnlijk verholpen. De codering staat bovenaan in het document.
Dat is juist het probleem, de xml-data wordt vanaf een externe bron gedownload, en daar heb ik geen invloed op. En eerlijk gezegd heb ik geen zin om het gehele bestand van te voren te openen, alle illegale karakters te verbeteren door #$x[hex]; om hem daarna door de parser te gooien.

Kan ik net zo goed een eigen parsertje schrijven.

Is er niet ergens in de source van de parser in te breken om de illegale karakters toch te laten accepteren? Of om ze op dat moment te verbeteren.