Delphi-PRAXiS
Seite 6 von 8   « Erste     456 78      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Ideen für spezielle Stringbearbeitung (https://www.delphipraxis.net/117587-ideen-fuer-spezielle-stringbearbeitung.html)

toyoman 24. Jul 2008 09:16

Re: Ideen für spezielle Stringbearbeitung
 
Zitat:

Zitat von marabu
Hallo,

hier eine kleine Starthilfe:

Delphi-Quellcode:
uses
  MSXML2;

function CreateDocument(var doc: IXMLDOMDocument2; const markup: string): Boolean;
begin
  doc := CoDomDocument.Create;
  doc.async := False;
  Result := doc.loadXML(markup);
end;

procedure TDemoForm.TestButtonClick(Sender: TObject);
const
  MARKUP
    = '<Baskets totalNumber="3">'
    + '<Basket path="W:\briefkorb\test\" opened="false" isUserAssigned="true" />'
    + '<Basket path="W:\briefkorb\test1\" opened="false" isUserAssigned="true" />'
    + '<Basket path="H:\daten\Docuware\Ablage\" opened="false" isUserAssigned="false" />'
    + '</Baskets> '
    ;
  XPATH = '//Basket[%d]/@path';
var
  doc: IXMLDOMDocument2;
  n: IXMLDOMNode;
begin
  if CreateDocument(doc, MARKUP) then
  begin
    n := doc.selectSingleNode(Format(XPATH, [1]));
    ShowMessage(VarToStr(n.nodeValue));
    n.nodeValue := ExtractFilePath(ParamStr(0));
    ShowMessage(doc.xml);
  end else ShowMessage(doc.parseError.reason);
end;
Statt MARKUP kann auch der Text aus der Datenbank eingesetzt werden.

Grüße vom marabu

Hallo marabu

in Bezug auf deinen Beispielcode: kannst du mir noch erklären was das mit dem MARKUP und XPATH auf sich hat?
ist das der Suchstring oder für was brauchts das?
Wenn ich jetzt deinen Beispielcode ausführe erhalte ich nämlich nur die Meldung:
Ein XML-Dokument muss ein Element der obersten Ebene enthalten.

Ich blick immer noch nicht durch.

toyoman 24. Jul 2008 09:16

Re: Ideen für spezielle Stringbearbeitung
 
Zitat:

Zitat von marabu
Wenn du genau liest, dann findest du heraus, dass du ComsDOMDocument verwenden musst. klick

ok hab ich jetzt gefunden...

marabu 24. Jul 2008 10:09

Re: Ideen für spezielle Stringbearbeitung
 
MARKUP ist bei mir einfach eine Konstante, bei dir der String mit dem DocuWare-XML, den du aus deiner Datenbank gelesen hast. Wenn mit dem XML-String irgendwas nicht stimmt, dann erhältst du eine Fehlermeldung, wie du ja gemerkt hast. Schau dir den XML-String mal genau an oder stelle den Text hier ein.

XPATH ist eine Spezifikation zur Addressierung einzelner DOM-Objekte. Der Zugriff über einen XPath-Ausdruck erspart dir umständliches Navigieren per Code.

toyoman 24. Jul 2008 10:28

Re: Ideen für spezielle Stringbearbeitung
 
Zitat:

Zitat von marabu
MARKUP ist bei mir einfach eine Konstante, bei dir der String mit dem DocuWare-XML, den du aus deiner Datenbank gelesen hast. Wenn mit dem XML-String irgendwas nicht stimmt, dann erhältst du eine Fehlermeldung, wie du ja gemerkt hast. Schau dir den XML-String mal genau an oder stelle den Text hier ein.

XPATH ist eine Spezifikation zur Addressierung einzelner DOM-Objekte. Der Zugriff über einen XPath-Ausdruck erspart dir umständliches Navigieren per Code.

Den XML String hab ich hier schon eingefügt (eine Seite zurück im Thread).
hab jetzt den Markup zu einer Variable gemacht und meinen XML String zugewiesen. Dadurch erhalte ich nun die sehr aussagekräftige Meldung: "An dieser Stelle sind keine Leerzeichen zugelassen."

Ich freue mich :)

marabu 24. Jul 2008 10:56

Re: Ideen für spezielle Stringbearbeitung
 
Dein XML-Dokument aus Beitrag #37 wird von meinem Beispiel-Code aus Beitrag #39 problemlos verarbeitet. Ich habe dein Dokument über die Zwischenablage in eine Datei kopiert und von dort zur Laufzeit in ein Memo geladen. Ich übergebe dann Memo.Text anstelle von MARKUP.

toyoman 25. Jul 2008 07:03

Re: Ideen für spezielle Stringbearbeitung
 
Zitat:

Zitat von marabu
Dein XML-Dokument aus Beitrag #37 wird von meinem Beispiel-Code aus Beitrag #39 problemlos verarbeitet. Ich habe dein Dokument über die Zwischenablage in eine Datei kopiert und von dort zur Laufzeit in ein Memo geladen. Ich übergebe dann Memo.Text anstelle von MARKUP.

Ok, meine Prozedur schaut nun so aus:

Delphi-Quellcode:
procedure Tfrmxml.Button1Click(Sender: TObject);
function CreateDocument(var doc: IXMLDOMDocument2; const markup: string): Boolean;
begin
  doc := ComsDOMDocument.Create;
  doc.async := False;
  Result := doc.loadXML(markup);
end;
const
{  MARKUP
    = ''
    + ''
    + ''
    + ''
    + ' '
    ;}
  XPATH = '//Basket[%d]/@path';
var
  anzahl: integer;
  i: integer;

  doc: IXMLDOMDocument2;
  n: IXMLDOMNode;
  MARKUP : string;


begin
  MARKUP := memo1.text;
  if CreateDocument(doc, MARKUP) then
  begin
    n := doc.selectSingleNode(Format(XPATH, [1]));
    ShowMessage(VarToStr(n.nodeValue));
    n.nodeValue := ExtractFilePath(ParamStr(0));
    ShowMessage(doc.xml);
  end else ShowMessage(doc.parseError.reason);


{   XMLDocument1.LoadFromFile(getpath+'test.xml');
   if xmldocument1.DocumentElement.NodeName='Baskets' then
   begin
       anzahl:=XMLDocument1.DocumentElement.Attributes['totalNumber'];
       for i := 0 to anzahl-1 do
       begin
         showmessage(XMLDocument1.DocumentElement.ChildNodes.Nodes[i].Attributes['path'])
       end;
   end;}

end;
Und dabei krieg ich die erwähnte Meldung (im memo1.text ist genau der XML String drin welcher in Beitrag #37 drin steht... )

marabu 25. Jul 2008 08:26

Re: Ideen für spezielle Stringbearbeitung
 
Moin,

kennst du keine Möglichkeiten einen Fehler einzugrenzen?

Versuche es mal so:

Delphi-Quellcode:
function CreateDocument(var doc: IXMLDOMDocument2; const markup: string): Boolean;
begin
  doc := ComsDOMDocument.Create;
  doc.async := False;
  Result := doc.loadXML(markup);
end;

procedure ShowParseError(pe: IXMLDOMParseError);
const
  FMT = 'line %d, linepos %d'#13'%s'#13#13'%s';
begin
  with pe do
    ShowMessage(Format(FMT, [line, linepos, reason, Copy(srctext, 1, linepos)]));
end;

procedure Tfrmxml.Button1Click(Sender: TObject);
const
  XPATH = '//Basket[%d]/@path';
var
  doc: IXMLDOMDocument2;
  n: IXMLDOMNode;
begin
  if CreateDocument(doc, Memo1.Text) then
  begin
    n := doc.selectSingleNode(Format(XPATH, [1]));
    ShowMessage(VarToStr(n.nodeValue));
  end else ShowParseError(doc.parseError);
end;
Freundliche Grüße

toyoman 25. Jul 2008 08:33

Re: Ideen für spezielle Stringbearbeitung
 
Zitat:

Zitat von marabu
Moin,

kennst du keine Möglichkeiten einen Fehler einzugrenzen?

Versuche es mal so:

Delphi-Quellcode:
function CreateDocument(var doc: IXMLDOMDocument2; const markup: string): Boolean;
begin
  doc := ComsDOMDocument.Create;
  doc.async := False;
  Result := doc.loadXML(markup);
end;

procedure ShowParseError(pe: IXMLDOMParseError);
const
  FMT = 'line %d, linepos %d'#13'%s'#13#13'%s';
begin
  with pe do
    ShowMessage(Format(FMT, [line, linepos, reason, Copy(srctext, 1, linepos)]));
end;

procedure Tfrmxml.Button1Click(Sender: TObject);
const
  XPATH = '//Basket[%d]/@path';
var
  doc: IXMLDOMDocument2;
  n: IXMLDOMNode;
begin
  if CreateDocument(doc, Memo1.Text) then
  begin
    n := doc.selectSingleNode(Format(XPATH, [1]));
    ShowMessage(VarToStr(n.nodeValue));
  end else ShowParseError(doc.parseError);
end;
Freundliche Grüße

In diesem Fall nicht, da ich mich damit nicht auskenne. Keine Ahnung wo ich da suchen soll.
Sonst wär ich wohl nicht hier im Forum drin...

toyoman 25. Jul 2008 08:42

Re: Ideen für spezielle Stringbearbeitung
 
line 5, linepos 70
An dieser Stelle sind keine Leerzeichen zugelassen.

oldIniSettingsForDW="[bibl_00995018.184_RESULT]#xD;#xA;COLFIXED=0#

hab den String jetzt extra hier nochmal von Hand eingegeben und ich kann wirklich kein Leerzeichen entdecken.

marabu 25. Jul 2008 09:10

Re: Ideen für spezielle Stringbearbeitung
 
Du interpretierst die übersetzte Fehlermeldung falsch - mit Leerzeichen ist white space gemeint und dazu zählen auch die kodierten Zeilenumbrüche.

Dein Fehler tritt bei mir nicht auf, weil ich mit MSXML4 getestet habe, du aber wohl MSXML6 benutzt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:42 Uhr.
Seite 6 von 8   « Erste     456 78      

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