Thema: Delphi XML lesen

Einzelnen Beitrag anzeigen

Benutzerbild von NoGAD
NoGAD

Registriert seit: 31. Jan 2006
Ort: Weimar
345 Beiträge
 
Delphi 10.4 Sydney
 
#1

XML lesen

  Alt 2. Mai 2021, 22:20
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
Mathias
Ich vergesse einfach zu viel.

Geändert von NoGAD ( 2. Mai 2021 um 22:39 Uhr) Grund: Typen vergessen
  Mit Zitat antworten Zitat