Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi JvSimpleXML - Value für Namen und entsprechende Property (https://www.delphipraxis.net/128897-jvsimplexml-value-fuer-namen-und-entsprechende-property.html)

Marco.Fischer 8. Feb 2009 21:29


JvSimpleXML - Value für Namen und entsprechende Property
 
Hallo,
ich habe folgende XML-Struktur:

...
<column>
<type>string</type>
<name lang="de">Seite</name>
<name lang="en">page</name>
<help lang="de">Deutsche Hilfe</help>
<help lang="en">English help</help>
</column>
...

Kann ich ohne Schleife gezielt auf den Value von z.B. <name lang="en">page</name> zugreifen und wenn ja, wie?

Danke für jede Hilfe.

Marco.

HalloDu 8. Feb 2009 21:54

Re: JvSimpleXML - Value für Namen und entsprechende Property
 
Hallo Marco,

ich weiß nicht ob JvSimpleXML das kann, aber für einen solchen Zugriff wäre XPath das richtige Stichwort.

Hoffe geholfen zu haben,
Frederic

haentschman 9. Feb 2009 05:00

Re: JvSimpleXML - Value für Namen und entsprechende Property
 
Hallo,

JvSimpleXML kann das. Du kannst den Value eines Eintrags sowohl über den Index des Items als auch über den Namen des Items ermitteln.
Je nach Stuktur mußt du mit den Items etwas experimentieren um den richtigen "Level" (bei dir 'type') zu kriegen.

könnte so aussehen:
JvSimpleXML.Root.Items.ItemNamed['bla'].Value
oder so:
JvSimpleXML.Root.Items.Item[0].Items.Item[1].Items.Item[1].Items.ItemNamed['bla'].Value

...so in der Art, je nach Struktur deiner XML. Mußt du ein wenig selbst experimentieren.

:hi:

Marco.Fischer 9. Feb 2009 07:00

Re: JvSimpleXML - Value für Namen und entsprechende Property
 
Hallo,

@haentschman

Danke für die Antwort. Ich verwende die Strukturen, die Du angegeben hast, bereits erfolgreich. Den Value von type kann ich problemlos ermitteln, aber wie soll dies für "<help lang="en">" funktionieren? Sowohl "<help lang="de">" als auch "<help lang="en">" haben ja als Key "help". Ich bräuchte also als eine Art "erweiterter" Key, z.B. "help@lang='de'"). Bei XPath verwendet man z.B. den Operator @ dafür.

Gruß
Marco.

haentschman 9. Feb 2009 16:18

Re: JvSimpleXML - Value für Namen und entsprechende Property
 
Hallo Marco,

war wohl noch ein wenig früh heut morgen :gruebel:
Ich schau mal, ob ich heut Abend vieleicht noch eine Lösung zusammenexperimentieren kann.
Die XML Struktur ist vom Root her wie in deinem Beispiel ?

bis später. :hi:

Lösungsvorschlag:
Delphi-Quellcode:
function TForm1.GetXMLValue(NodeName, NodeProperty: String): String;
var I: Integer;
begin
  Result:= '';
  for I := 1 to JvSimpleXML1.Root.Items.Count-1 do
    begin
      if (JvSimpleXML1.Root.Items.Item[I].Name = NodeName) and
         (JvSimpleXML1.Root.Items.Item[I].Properties.Value('lang') = NodeProperty) then
            Result:= JvSimpleXML1.Root.Items.Item[I].Value;
    end;
end;
Aufruf z.B.:

GetXMLValue('help','de') ergibt nach deinem Beispiel als Rückgabewert "Deutsche Hilfe"
GetXMLValue('name','de') ergibt nach deinem Beispiel als Rückgabewert "Seite"
GetXMLValue('help','en') ergibt nach deinem Beispiel als Rückgabewert "English help"

hoffe du kommst jetzt weiter. :thumb:

Marco.Fischer 10. Feb 2009 20:40

Re: JvSimpleXML - Value für Namen und entsprechende Property
 
Hallo haentschman,

mit diesem Ansatz klappt es jetzt. Vielen Dank. :thumb:

Aber wahrscheinlich ist der vorgeschlagene XPath-Ansatz konsequenter, weil man damit auf die Schleife verzichten kann. Ich werde mir demnächst XPath mal näher betrachten. OpenXML kann dies wohl.

Gruß,
Marco.

haentschman 10. Feb 2009 21:23

Re: JvSimpleXML - Value für Namen und entsprechende Property
 
Hallo,

Zitat:

Aber wahrscheinlich ist der vorgeschlagene XPath-Ansatz konsequenter, weil man damit auf die Schleife verzichten kann. Ich werde mir demnächst XPath mal näher betrachten. OpenXML kann dies wohl.
...die werden das intern wahrscheinlich auch nicht anders lösen da XML textbasiert ist :wink: .

...jedenfalls waren alle Versuche mit "ItemNamed" in Abhängigkeit von der Property erfolglos. so blieb nur diese Variante.

:hi:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:29 Uhr.

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