![]() |
XML zum Verzweifeln
Ich nehme aber an, dass der Fehler bestimmt vor dem Monitor sitzt...
Ich lese eine XML Datei, recht gross, viele Unterstrukturen und Listen. Jetzt habe ich eine Zubehörliste pro Produkt und würde die Felder gern generisch auslesen. Der Code, der mich da verwirrt sieht so aus :
Code:
Das ist nur ein Code-Snippet, also Öffnen und die oberen Ebenen durchzugehen ist da nicht dabei..
var
lAccessories: IXMLNodeList; lAcc, lChild: IXMLNode; begin lAccessories := lItem.ChildNodes.FindNode('accessory_list').ChildNodes; // findet er lAcc := lAccessories.First; while Assigned(lAcc) do begin CodeSite.Send(csmLevel1, '', lAcc.ChildNodes.Count ); // Codesite schreibt 36 lChild := lAcc.ChildNodes.First; while Assigned(lChild) do begin CodeSite.Send(csmLevel1, lChild.NodeName, VarToStr(lChild.NodeValue)); lChild := lChild.NextSibling; end; lAcc := lAcc.NextSibling; end; end; Beim Durchlaufen kommt "natürlich" ein Fehler (sonst wäre es ja auch langweilig) : --------------------------- Debugger Exception Notification --------------------------- Project Import.exe raised exception class EXMLDocError with message 'Element "alternative_info" does not contain a single text node'. --------------------------- Break Continue Copy Help --------------------------- Hier mal ein Stück des XML
Code:
Nun die Frage:
<accessory_item>
<item_id>-2761267905524739048</item_id> <identification>1[1]</identification> <item_number/> <item_subnumber>1</item_subnumber> <item_number_architect/> <item_number_internal/> <item_number_online/> <item_piece_number_list/> <sorting_indicator>t</sorting_indicator> <harmonized_system_code_number/> <article_for_sale_number>NKM02</article_for_sale_number> <article_for_sale_number_internal>NKM02</article_for_sale_number_internal> <item_piece>1</item_piece> <short_description>NKM02 - Listwa transportowa</short_description> <internal>true</internal> <price_representation>price_charged_in_jumbo</price_representation> <print_image>false</print_image> <material_groups_key>Transport</material_groups_key> <commission_groups_key/> <revenue_accounts_description>STD</revenue_accounts_description> <F_A_cost_centres_key/> <ce_text_list/> <alternative_info> <--- hier crasht er <alternative>false</alternative> </alternative_info> <amendment_info> <amendment>false</amendment> </amendment_info> <needs_info> <as_needed>false</as_needed> </needs_info> <related_info> <taken_from_previous>false</taken_from_previous> </related_info> Woran erkenne ich solche Elemente, die dann "Unterelemente" haben ? Nodetype ist es nicht, ist immer die gleiche Ord-Zahl von 1 |
AW: XML zum Verzweifeln
So, habe jetzt rausgefunden, dass ich ein Element wie das "<ce_text_list/>" über IsTextElement=False + ChildNodes.Count = 0 rausfiltern kann (haben ja keinen Wert).
Die Unterlisten gehen dann über IsTextElement=False + ChildNodes.Count > 0 |
AW: XML zum Verzweifeln
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
|
AW: XML zum Verzweifeln
Ich habe eine Pro-Version von Delphi (vom Arbeitgeber gestellt), da gibt es diesen Punkt nicht... :(
|
AW: XML zum Verzweifeln
Zitat:
|
AW: XML zum Verzweifeln
Danke, ich schau mal daheim in der Installation, weil im Büro sehe ich es nicht und GetIt funktioniert hier nicht (wohl irgendwas im Proxy falsch konfiguriert).
|
AW: XML zum Verzweifeln
Ich hab Delphi 10.4 Pro und habe ebenfalls diesen Wizard.
Nur ist er gegenüber früher, in der Kategorie Web und nicht in XML zu finden. |
AW: XML zum Verzweifeln
Ich habe jetzt im Endeffekt eine lauffähige rekursive Funktion, die den Namen des Unterlementes an den Parent-Namen (mit Punkt getrennt) anhängt. Das ganze wird
Code:
Im Codesite wird das dann als Baum ausgegeben, leere Elemente werden unterdrückt. Dazu gibt es noch einen Aufruf von DoIterate, der Falsxe zurückliefert, wenn etwas nicht durchgegangen werden soll (ich muss einige Sachen gesondert behandeln).
procedure IterateNode(ARoot: IXMLNode; ACurrentNodeName: String = '');
var lChild: IXMLNode; lNodeName: String; begin lNodeName := IfThen(ACurrentNodeName <> '', ACurrentNodeName + '.', ''); lChild := ARoot.ChildNodes.First; while Assigned(lChild) do begin if Not lChild.IsTextElement then begin if lChild.ChildNodes.Count > 0 then begin if DoIterate(lChild.NodeName) then begin CodeSite.EnterMethod(lChild.NodeName); IterateNode(lChild, lNodeName + lChild.NodeName); CodeSite.ExitMethod(lChild.NodeName); end; end; end else begin CodeSite.Send(csmLevel1, lNodeName + lChild.NodeName, VarToStr(lChild.NodeValue)); end; lChild := lChild.NextSibling; end; end; Jedenfalls ist es eine lauffähige Lösung, damit der Thread auch einen Abschluss hat :) |
AW: XML zum Verzweifeln
|
AW: XML zum Verzweifeln
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz