![]() |
XMLAttribut auslesen
Ich habe folgendes XML Dokument:
XML-Code:
Wie komme ich jetzt an die Attribute dran? Ich habe es so versucht ein Attribut auszuwählen:
<importkennungen>
<Zeitraum jahr="2007"> <Ziel kennung="11A13">(#BUNG07)\Lieferschein</Ziel> <Ziel kennung="11A15">(#BUNG07)\Rechnung</Ziel> <Ziel kennung="11A11">(#BUNG07)\Firma2\Lieferschein</Ziel> </Zeitraum> <Zeitraum jahr="2006"> <Ziel kennung="11A13">(#BUNG06)\Lieferschein</Ziel> <Ziel kennung="11A15">(#BUNG06)\Rechnung</Ziel> <Ziel kennung="11A11">(#BUNG06)\Firma2\Lieferschein</Ziel> </Zeitraum> <Zeitraum jahr="2005"> <Ziel kennung="11A13">(#BUNG05)\Lieferschein</Ziel> <Ziel kennung="11A15">(#BUNG05)\Rechnung</Ziel> <Ziel kennung="11A11">(#BUNG05)\Firma2\Lieferschein</Ziel> </Zeitraum> <Zeitraum jahr="2004"> <Ziel kennung="11A13">(#BUNG04)\Lieferschein</Ziel> <Ziel kennung="11A15">(#BUNG04)\Rechnung</Ziel> <Ziel kennung="11A11">(#BUNG04)\Firma2\Lieferschein</Ziel> </Zeitraum> </importkennungen>
Delphi-Quellcode:
Aber da sagt mir, dass Attr.name readonly ist und ich keinen Wert zuweisen könnte. Aber wie kann ich ein Attribut jetzt auswählen und auslesen. Ein Knoten kann ja auch mehrere Attribute haben.
function TConfigFile.GetIsYearConfigured(const Year: String): Boolean;
var DummyNode: IXMLDOMNode; Attr: IXMLAttribute; begin result := False; DummyNode := FXmlDoc.selectSingleNode('\importkennungen\zeitraum'); if DummyNode <> nil then begin Attr.name := 'jahr'; result := Attr.value <> ''; end; end; Ach so, un dich müsste dann och durch alle Knoten "Zeitraum" durch itterieren, um zu sehen, ob da das gesuchte Jahr vorkommt. |
Re: XMLAttribut auslesen
So, durch die SubNodes "Zeitraum" kann ich schon mal durch it6terieren:
Delphi-Quellcode:
Nur wie komme ich jetzt an das Attribut "jahr" dran?
function TConfigFile.GetIsYearConfigured: Boolean;
var ChildNodes: IXMLDOMNodeList; SubNode: IXMLDOMNode; Attr: IXMLAttribute; i: Integer; s: String; begin result := False; if FYear <> '' then begin ChildNodes := FXmlDoc.documentElement.selectNodes('Zeitraum'); for i := 0 to ChildNodes.length - 1 do begin SubNode := ChildNodes.item[i]; //s := Attr.value; //Writeln(s); end; end else raise Exception.Create(rsNoYear); end; |
Re: XMLAttribut auslesen
|
Re: XMLAttribut auslesen
Das habe ich auch schon gefunden, nur helfen tut es nicht wirklich. Ich habe es jetzt so:
Delphi-Quellcode:
... aber das funktioniert auch nicht:
function TConfigFile.GetIsYearConfigured: Boolean;
var ChildNodes: IXMLDOMNodeList; SubNode: IXMLDOMNode; Attr: IXMLDOMAttribute; i: Integer; s: String; begin result := False; if FYear <> '' then begin ChildNodes := FXmlDoc.documentElement.selectNodes('zeitraum'); for i := 0 to ChildNodes.length - 1 do begin SubNode := ChildNodes.item[i]; s := FxmlDoc.documentElement.getAttribute('jahr'); ShowMessage(s); end; end else raise Exception.Create(rsNoYear); end; Zitat:
|
Re: XMLAttribut auslesen
Das Attribut selbst wird als Subnode dargestellt. Rankommen kannst du mit folgendem XPath Ausdruck:
Code:
Das @ zeigt, dass es sich um keinen wirklichen Subnode handelt, sondern nur um ein Attribut.
FXmlDoc.selectSingleNode('/importkennungen/Zeitraum/@jahr');
Über das nodeValue oder text attribut (weiß jetzt nicht genau welches) kommst du dann an den Inhalt. Martin |
Re: XMLAttribut auslesen
Zitat:
Zitat:
Delphi-Quellcode:
Ich muss aber durch alle durchitterieren.
function TConfigFile.GetIsYearConfigured: Boolean;
var ChildNodes: IXMLDOMNodeList; SubNode: IXMLDOMNode; Attr: IXMLDOMAttribute; i: Integer; s: String; begin result := False; if FYear <> '' then begin ChildNodes := FXmlDoc.documentElement.selectNodes('zeitraum'); for i := 0 to ChildNodes.length - 1 do begin SubNode := ChildNodes.item[i]; s := FXmlDoc.selectSingleNode('/importkennungen/zeitraum/@jahr').nodeValue; ShowMessage(s); end; |
Re: XMLAttribut auslesen
Bin mir jetzt nicht ganz sicher, aber versuch mal folgendes:
Code:
i = 0 - (anzahl zeiträume-1)
'/importkennungen/zeitraum[i]/@jahr'
ich glaub so müsstest du durchiterieren können (fast genauso wie beim array) |
Re: XMLAttribut auslesen
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var XMLDocument: TXMLDocument; XMLNode: IXMLNode; begin XMLDocument := TXMLDocument.Create(Form1); XMLDocument.LoadFromFile('Pfad\zur\Datei\Datei.xml'); XMLNode := XMLDocument.DocumentElement.ChildNodes.First; // erster "Zeitraum"-Knoten if (XMLNode <> nil) then begin while (XMLNode <> nil) do begin if (XMLNode.HasAttribute('jahr')) then ShowMessage(XMLNode.Attributes['jahr']); XMLNode := XMLNode.NextSibling; // zum nächsten Knoten auf der Ebene / nil, wenn es keine Knoten mehr gibt end; end; XMLDocument.Free; end; |
Re: XMLAttribut auslesen
Danke. Das sieht gut aus. Nur kennt er bei mir nicht ChildNodes.First und HasAttributes. Und das Attribut ansprechen mit XMLNode.Attributes['jahr'] geht auch nicht, da meint er:
Zitat:
Verdammt, es kann doch nicht so schwer sein die Attribute von Knoten auszulesen. :wall: |
Re: XMLAttribut auslesen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:16 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-2025 by Thomas Breitkreuz