Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi MSXML: Nicht valide Nodes ignorieren (https://www.delphipraxis.net/127745-msxml-nicht-valide-nodes-ignorieren.html)

Alaitoc 9. Feb 2009 14:59

Re: MSXML: Nicht valide Nodes ignorieren
 
Endlich eine Art Durchbruch...MultipleErrors funktioniert scheinbar nur bei der Schemaüberprüfung, also

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var tmp: IXMLDOMDocument2;
    lst: IXMLDOMParseErrorCollection;
    schema : IXMLDOMSchemaCollection2;
    i: Integer;
begin
  Memo.Clear;
  tmp := CoDOMDocument60.Create;
  schema:=CoXMLSchemaCache60.Create;
  tmp.setProperty('MultipleErrorMessages', true);
  tmp.loadXML('<test><a></a>[b][/b]</test>');
  schema.add('','C:\xsd.xsd');
  tmp.schemas:=schema;

  lst := (tmp.validate as IXMLDOMParseError2).allErrors;
  for i := 0 to lst.length -1  do
  begin
    Memo.Lines.Add(lst.item[i].reason);
  end;
end;
Zitat:

Der Inhalt des Elements 'a' ist gemäß dem Inhaltsmodell des übergeordneten Elements 'XXXXX' nicht gültig.
Erwartet: XXXX1, XXXX2, XXXX3, XXXX4, XXXX5.

Das Element 'b' wird verwendet, aber es ist im DTD/Schema nicht deklariert .
Zwar in gewisser Weise keine gute Nachricht...aber naja...jetzt müsste ich mir nur irgendwas überlegen wie er nicht beim Überprüfen der Wohlgeformtheit der XML-Datei abbricht. Und so perfekt wirkt es auch noch nicht...hmhm

Falls wer einen Tipp hat, her damit!

MfG Alaitoc

PS: Schonmal Danke für die Mühen :>

Mr_G 9. Feb 2009 15:34

Re: MSXML: Nicht valide Nodes ignorieren
 
Zitat:

Zitat von Alaitoc
Endlich eine Art Durchbruch...MultipleErrors funktioniert scheinbar nur bei der Schemaüberprüfung,...

Daher meine Frage nach dem Schema...

Was dein allgemeines Problem angeht: Eine "echte" Möglichkeit wird es wohl nicht geben... man weiß ja nicht wo der Fehler liegt und kann daher wahrscheinlich auch kaum "defekte" Teile ausschließen.

Was meine Frage angeht: Hast du schonmal probiert die "nicht-validen" Nodes ausfindig zu machen und bei der Verarbeitung zu ignorieren?

Alaitoc 9. Feb 2009 15:46

Re: MSXML: Nicht valide Nodes ignorieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Bin grade in gewisser Weise dabei, der MSXML Parser lädt den Text immer von oben nach unten und von innen nach außen...also wie in der Grafik beschrieben:

1.C
2.B
3.A
4.C2
5.B2
6.A2
7.Test

In diesen Blöcken...also müsste ich mir theorethisch "nur" eine Funktion schreiben die dann diesen Text "löscht" und weiter validiert, bis halt der ganze Text "richtig" ist. Und dann die Fehler ausgibt und markiert, wenn dann der ganze Text keine XML Fehler hat wird er erst mit dem XSD Schema verglichen...
Ist halt nur das Problem das Gegenstück jeweils von der "Fehlerquelle" zu finden.
Hmhm werde mal schauen.

MfG Alaitoc

Mr_G 9. Feb 2009 15:52

Re: MSXML: Nicht valide Nodes ignorieren
 
Ja... wie gesagt... das Gegenstück... Es könnte sich ja z.B. auch um Schreibfehler bzw. Auslassungen handeln etc. pp.
Ich kann mich gerade nicht so intensiv damit beschäftigen aber ich freue mich, wenn du mich auf dem Laufenden hälst! :chat:

Alaitoc 9. Feb 2009 16:23

Re: MSXML: Nicht valide Nodes ignorieren
 
Hui...ist doch ziemlich kompliziert, sobald man mal bei einem Element ein / vergisst zum schließen...ich glaub das wird länger dauern mit der Planung *seufz*

Gibts zufällig irgendwo eine feste Dokumentation wie das in welcher Reihenfolge geprüft wird mit der Wohlgeformtheit?^^

Naja werde mich morgen erstmal daran setzen...vll ist es ja machbar mit den Informationen die mir der MSXML Parser liefert.

MfG Alaitoc

Alaitoc 11. Feb 2009 10:29

Re: MSXML: Nicht valide Nodes ignorieren
 
Hm naja eine Möglichkeit wäre nun den Text durchzugehen, jeweils den Text von < bis > zu speichern und immer hochzuzählen , bzw. bei </ > runterzuzählen und die Elemente damit zu nummerieren und zu sagen ob es ein Anfangs oder Endelement ist.

Beispiel:
1 2 3 4 3 4 3 2 1 0
<test><a><c></c><c></c></a></test>

Falls dann ein Fehler auftritt, sucht man vom Endelement aus das andere Element...indem man die Zahl des Endelements+1 sucht und überprüft ob es ein Anfangselement ist...theorethisch könnte man diese dann ganz leicht entfernen und dann wieder validieren...jedoch ist das nicht umbedingt effizient x)

MfG Alaitoc

himitsu 11. Feb 2009 10:34

Re: MSXML: Nicht valide Nodes ignorieren
 
Zitat:

Zitat von Alaitoc
Hm naja eine Möglichkeit wäre nun ...

Das würde z.B. falsche Anfangs- und End-Tag nicht beachten
z.B.
Delphi-Quellcode:
<test><a></test>

<test><a></test></a>

Alaitoc 11. Feb 2009 10:51

Re: MSXML: Nicht valide Nodes ignorieren
 
Naja das was du jetzt da beschreibst, wäre ja ein Fehler:

"Endtag /test stimmt nicht mit Anfangstag a überein" oder so

Und naja
---1---2---1---
<test><a><test>

Da wüßte ich ja trotzdem das nu <test>.nummer+1 = <a> das Anfangsstück ist auch wenn es fehlerhaft ist.

Edit: Zumindest sollte ich so immer wissen welche beiden "Elemente" zusammengehören...auch wenn sie fehlerhaft sind...natürlich müsste ich dann auch noch einige andere Sachen berücksichtigen z.b. fehlende > oder so


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:36 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz