Einzelnen Beitrag anzeigen

Perlsau
(Gast)

n/a Beiträge
 
#7

AW: Anzeigen eines Ebooks im epub-Format

  Alt 1. Aug 2015, 13:06
Okay, das ist eine ehrliche Antwort, die keines weiteren Kommentars bedarf ... ist ja auch schon bald 20 Monate her, daß du dich damit befaßt hast

Doch offenbar kennst du dich ein wenig mit XML-Bearbeitung aus. Falls ich mich hierin geirrt habe, sind natürlich auch andere User dazu aufgerufen, zur Lösung beizutragen ... Ich erhalte nämlich an der Stelle, wo ich die container.xml durchsuchen will, eine Zugriffsverletzung:

TextDataBase.exe ist eine Exception der Klasse EInvalidPointer mit der Meldung 'Ungültige Zeigeroperation' aufgetreten.

... und zwar an dieser Stelle:
cr.opfFile := XmlDoc.DocumentElement.ChildNodes['rootfiles'].ChildNodes['rootfile'].AttributeNodes['full-path'].Text; Bei mir sieht das natürlich ein wenig anders aus, ist aber im Grunde dasselbe:
Delphi-Quellcode:
Function TEpubs.GetMetaData : Boolean;
begin
  Inhalt.MemS.Seek(0,soFromBeginning);
  If Inhalt.MemS.Size = 0 Then
  Begin
    Result := False;
    GLD.Fehlertext := 'Stream für Container.xml ist leer - in "' + Inhalt.EpubDatei + '"';
  End ELse
  Try
    XmlDok.LoadFromStream(Inhalt.MemS);
    Inhalt.OpfFile := XmlDok.DocumentElement.ChildNodes['rootfiles'].ChildNodes['rootfile'].AttributeNodes['full-path'].Text;
    Inhalt.OpfDir := ExtractOpfDir(Inhalt.OpfFile);
    Result := True;
  Except
    On e:exception Do
    Begin
      Result := False;
      GLD.Fehlertext := 'Fehler beim Analysieren der Container.xml in "' + Inhalt.EpubDatei + '": ' + e.Message;
    End;
  End;
end;
Die Methode ist Teil einer Klasse, die bereits im Constructor alle benötigten Komponenten erzeugt (und selbstverständlich im Destructor wieder freigibt):
Delphi-Quellcode:
Constructor TEpubs.Create;
begin
  inherited;
  UnZip := TAbUnZipper.Create(Nil);
  XmlDok := TXMLDocument.Create(nil);
  XmlDok.DOMVendor := DOMVendors.Vendors[0];
  Inhalt.MemS := TMemoryStream.Create;
  LogList := TStringList.Create;
  If System.SysUtils.FileExists(GLD.URec.LogDatei) Then
     LogList.LoadFromFile(GLD.URec.LogDatei);
end;
Wieso löst der Zugriff auf die Childnodes von container.xml eine ungültige Zeigeroperation aus? Bin leider kein XML-Experte, was ich wohl ändern sollte ...
Die container.xml sieht ja bei allen Epubs ziemlich gleich aus, manchmal feht der Encoding-Hinweis, aber sonst:
Code:
  <?xml version="1.0" encoding="UTF-8" ?>
  - <container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
    - <rootfiles>
        <rootfile full-path="OEBPS/content.opf" media-type="application/oebps-package+xml" />
      </rootfiles>
    </container>
  Mit Zitat antworten Zitat