Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi XML lesen (https://www.delphipraxis.net/207784-xml-lesen.html)

NoGAD 2. Mai 2021 22:20


XML lesen
 
Huhu.

Statt JSON dieses mal XML.

Folgenden XML-Code habe ich und möchte alle Elemente von work auslesen.

Code:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<classify xmlns="http://classify.oclc.org">
  <response code="4"/>
  <!--Classify is a product of OCLC Online Computer Library Center: http://classify.oclc.org-->
  <workCount>5</workCount>
  <start>0</start>
  <maxRecs>25</maxRecs>
  <orderBy>thold desc</orderBy>
  <input type="title">Rabenpresse</input>
  <works>
    <work author="Liersch, Hendrik" editions="9" format="Book" holdings="78" hyr="2007" itemtype="itemtype-book" lyr="2007" owi="900052081" schemes="DDC LCC" title="Die fast vollständige Geschichte der Rabenpresse : aus Anlaß der Ausstellung im Foyer der Universitätsbibliothek der Freien Universität Berlin vom 26. September bis zum 30. November 2007" wi="175651286"/>
    <work author="Fuchs, Günter Bruno [Contributor; Editor]" editions="9" format="Book" holdings="20" hyr="1969" itemtype="itemtype-book" lyr="1968" owi="44577153" schemes="LCC" title="Berlin-Buch der Neuen Rabenpresse : mit einem Calendarium auf das Jahr 1969" wi="43039960"/>
    <work author="Hantzsch, Friedrich Georg" editions="3" format="Book" holdings="3" hyr="2012" itemtype="itemtype-book" lyr="2012" owi="1203218774" schemes="LCC" title="Die Rabenpresse selig" wi="824666518"/>
    <work author="(Hrsg.), Hermann Schladt" editions="1" format="eBook" holdings="2" hyr="2014" itemtype="itemtype-book-digital" lyr="2014" owi="2945336410" schemes="DDC" title="Edition Rabenpresse 1: Romanzero" wi="943835587"/>
    <work editions="1" format="Book" holdings="1" hyr="2007" itemtype="itemtype-book" lyr="2007" owi="5622368915" schemes="DDC" title="Die fast vollständige Geschichte der Rabenpresse : aus Anlass der Ausstellung im Foyer der Universitätsbibliothek der Freien Universität Berlin vom 26. September bis 30. November 2007" wi="888198670"/>
  </works>
</classify>
Diesen Code habe ich geschrieben, kann jedoch nicht auf die Unterlemente von works zugreifen.

Delphi-Quellcode:
type
  TJSon_Items = record
    Title: string;
    Author: String;
    Publisher: String;
    PublishedDate: String;
    Description: String;
    ImageLinks_Thumbnail: String;
    ImageLinks_SmallThumbnail: String;
    ListPrice: String;
    ISBN_Type: String;
    ISBN10: String;
    ISBN13: String;
    ISBNOTHER: String;
  end;

type
  TMyJSON = record
    TotalItems: Integer;
    Items: TJSONArray;
    ItemsArray: Array of TJSon_Items;
    Result: Boolean;
  end;


function JSON_OCLC(urlResult: String; var JSONObject: TJSONObject; var JSonValue: TJSonValue): TMyJSON;
var
  XML: IXMLDOMDocument;
  node: IXMLDomNode;
  nodes_row, nodes_se: IXMLDomNodeList;
  i, j: Integer;
  Dummy_String: String;
begin

  XML := CreateOleObject('Microsoft.XMLDOM') as IXMLDOMDocument;
  XML.async := False;
  XML.loadXML(urlResult);
  if XML.parseError.errorCode <> 0 then
    raise Exception.Create('XML Load error:' + XML.parseError.reason);

  nodes_row := XML.selectNodes('classify/works/work');

  setlength(Result.ItemsArray, nodes_row.Length); // hier konnte die Länge korrekt mit 5 ermittelt werden

  for i := 0 to Pred(nodes_row.Length) do
  begin
    node := nodes_row.item[i];
    Result.ItemsArray[i].Author := node.selectSingleNode('author').text; // HIER hakt es, weil nichts gefunden wird, auch die Suche nach 'work author' bringt eine exception.
    Result.ItemsArray[i].Title := node.selectSingleNode('title').text;
    Result.ItemsArray[i].PublishedDate := node.selectSingleNode('hyr').text;
  end;

end;


// Beispielaufruf:

var
  JSONObject: TJSONObject;
  JSonValue: TJSonValue;
  MyJson: TMyJSON;
  Dummy_String: String;
begin

  Dummy_String := '' +
    '<?xml version="1.0" encoding="UTF-8" standalone="no"?>' +
    '<classify xmlns="http://classify.oclc.org">' +
    ' <response code="4"/>' +
    ' <!--Classify is a product of OCLC Online Computer Library Center: http://classify.oclc.org-->' +
    ' <workCount>5</workCount>' +
    ' <start>0</start>' +
    ' <maxRecs>25</maxRecs>' +
    ' <orderBy>thold desc</orderBy>' +
    ' <input type="title">Rabenpresse</input>' +
    ' <works>' +
    '   <work author="Liersch, Hendrik" hyr="2007" lyr="2007" title="Die fast vollständige Geschichte der Rabenpresse : aus Anlaß der Ausstellung im Foyer der Universitätsbibliothek" wi="175651286"/>' +
    '   <work author="Fuchs, Günter Bruno [Contributor; Editor]" hyr="1969" lyr="1968" title="Berlin-Buch der Neuen Rabenpresse : mit einem Calendarium auf das Jahr 1969" wi="43039960"/>' +
    '   <work author="Hantzsch, Friedrich Georg" editions="3" format="Book" holdings="3" hyr="2012" itemtype="itemtype-book" lyr="2012" owi="1203218774" schemes="LCC" title="Die Rabenpresse selig" wi="824666518"/>' +
    '   <work author="(Hrsg.), Hermann Schladt" hyr="2014" lyr="2014" title="Edition Rabenpresse 1: Romanzero" wi="943835587"/>' +
    '   <work editions="1" hyr="2007" lyr="2007" title="Die fast vollständige Geschichte der Rabenpresse : aus Anlass der Ausstellung "/>' +
    ' </works>' +
    '</classify>';

  MyJson := JSON_OCLC(Dummy_String, JSONObject, JSonValue);
  showmessage(MyJson.ItemsArray[0].Author);
end;
Wie gelange ich an Author, title und hyr (z.B.)?

LG Mathias


Edit: Typen hinzugefügt, Beispielaufruf hinzugefügt

Aviator 2. Mai 2021 23:27

AW: XML lesen
 
Du musst die Attribute der Nodes auslesen. Mit
Delphi-Quellcode:
HasAttribute()
kannst du prüfen ob das Attribut existiert. Dann mit
Delphi-Quellcode:
Attributes[xxx]
den Wert auslesen.

TiGü 3. Mai 2021 11:29

AW: XML lesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Eine Funktion, die JSON_OCLC heißt und dann XML verarbeitet ist auch so haarscharf an Mind-Explosion!

Warum nutzt du nicht den XML-Binding-Wizard?
In Delphi Sydney ein neues VCL-Projekt öffnen und dann nochmal über File | New | Other | Delphi | Web | XML Data Binding auswählen.
Dann dem Dialog eine Beispiel-XML vorwerfen.

Delphi-Quellcode:
uses
  works, Xml.XMLDoc;

const
    Dummy_String = '' +
    '<?xml version="1.0" encoding="UTF-8" standalone="no"?>' +
    '<classify xmlns="http://classify.oclc.org">' +
    ' <response code="4"/>' +
    ' <!--Classify is a product of OCLC Online Computer Library Center: http://classify.oclc.org-->' +
    ' <workCount>5</workCount>' +
    ' <start>0</start>' +
    ' <maxRecs>25</maxRecs>' +
    ' <orderBy>thold desc</orderBy>' +
    ' <input type="title">Rabenpresse</input>' +
    ' <works>' +
    ' <work author="Liersch, Hendrik" hyr="2007" lyr="2007" title="Die fast vollständige Geschichte der Rabenpresse : aus Anlaß der Ausstellung im Foyer der Universitätsbibliothek" wi="175651286"/>' +
    ' <work author="Fuchs, Günter Bruno [Contributor; Editor]" hyr="1969" lyr="1968" title="Berlin-Buch der Neuen Rabenpresse : mit einem Calendarium auf das Jahr 1969" wi="43039960"/>' +
    ' <work author="Hantzsch, Friedrich Georg" editions="3" format="Book" holdings="3" hyr="2012" itemtype="itemtype-book" lyr="2012" owi="1203218774" schemes="LCC" title="Die Rabenpresse selig" wi="824666518"/>' +
    ' <work author="(Hrsg.), Hermann Schladt" hyr="2014" lyr="2014" title="Edition Rabenpresse 1: Romanzero" wi="943835587"/>' +
    ' <work editions="1" hyr="2007" lyr="2007" title="Die fast vollständige Geschichte der Rabenpresse : aus Anlass der Ausstellung "/>' +
    ' </works>' +
    '</classify>';

procedure TForm3.FormCreate(Sender: TObject);
var
  Classify: IXMLClassifyType;
  Works: IXMLWorksType;
  Work: IXMLWorkType;
  I: Integer;
begin
  Classify := Getclassify(Xml.XMLDoc.LoadXMLData(Dummy_String));

  Works := Classify.Works;

  for I := 0 to Works.Count - 1 do
  begin
    Work := Works.Work[I];
    ShowMessage(Work.Author);
  end;
end;

KodeZwerg 3. Mai 2021 13:16

AW: XML lesen
 
auf api/interface ebene war das nach einem select (auf "works") irgendwie so hier (aus dem bauch heraus):
Delphi-Quellcode:
xmlDoc.getElementsByTagName("author")[0].childNodes[0].nodeValue;

NoGAD 7. Mai 2021 21:03

AW: XML lesen
 
Hallo und vielen Dank an euch für die Anregungen.


Mir wäre es tatsächlich lieber gewesen, wenn ich das händisch hätte eruieren können, aber die XML-Struktur konnte ich tatsächlich nur mit Hilfe des Beitrags von TiGü korrekt auslesen.

Dass es diesen Assistenten gibt, wusste ich nicht.

LG MAthias


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:27 Uhr.

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