![]() |
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:
|
Re: XMLAttribut auslesen
Sorry. Mein Fehler. Du musst natürlich den Suchausdruck erst noch zusammensetzen.
suchString := '/importkennungen/Zeitraum['+IntToStr(i) +']/@jahr' ach ja, das erste element hat auch den index 1 (und nicht 0) |
Re: XMLAttribut auslesen
Nein, das kann auch keine Lösung sein. Aber so geht es:
Delphi-Quellcode:
;)
function TConfigFile.GetIsYearConfigured: Boolean;
var ChildNodes: IXMLDOMNodeList; SubNode: IXMLDOMNode; 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 := SubNode.selectSingleNode('@jahr').nodeValue; ShowMessage(s); end; end else raise Exception.Create(rsNoYear); end; |
Re: XMLAttribut auslesen
Zitat:
|
Re: XMLAttribut auslesen
Delphi-Quellcode:
Importierte Typbibliothek ist die Version 3.0, um mit dem IE 5.0 kompatibel zu sein. Muss leider so sein, da unbedibngt sichergestekllt sein muss, dass sie auf dem Zielrechner existiert.
FXmlDoc: msDomDocument;
|
Re: XMLAttribut auslesen
Zitat:
Delphi-Quellcode:
:stupid:
function TConfigFile.GetIsYearConfigured(year: string): boolean;
var node : IXMLNode; begin node := FXmlDoc.selectSingleNode( Format('/importkennungen/Zeitraum[@jahr="%s"]', [year])); Result := node <> nil; end; |
Re: XMLAttribut auslesen
Hmpf. Ich wusste das du mit so einer Streberlösung daher kommen würdest. Bekommst du das auch für die Kennung hin? ;)
|
Re: XMLAttribut auslesen
Ist doch im Prinzip das gleiche. :zwinker: Du musst es nur kombinieren. Der XPath-Ausdruck:
Code:
würde als Ergebnis den Knoten
/importkennungen/Zeitraum[@jahr="2007"]/Ziel[@kennung="11A15"]
XML-Code:
aus deiner Datei liefern. Anstelle der festen Angaben setzt du eben nur die Platzhalter rein.
<Ziel kennung="11A15">(#BUNG07)\Rechnung</Ziel>
|
Re: XMLAttribut auslesen
Zitat:
|
Re: XMLAttribut auslesen
Ich sage doch, so schwer ist XML gar nicht. Das kapierst du, auch ohne zum Klo zu rennen. :mrgreen:
|
Re: XMLAttribut auslesen
Zitat:
|
Re: XMLAttribut auslesen
Ich verstehe es nicht. Ich muss irgendwo etwas falsch machen, aber ich sehe nicht wo.
Ich habe folgende XML-Datei:
XML-Code:
Jetzt will ich den Wert von Form auslesen in Abhängigkeit vom Attribut name, wenn dasnicht klapp, weil kein passendes Attribut gefunden wurde wurde, soll das Attribut von [u]DateMap[i] ausgelesen werden.
<importkennungen>
<DateMap default="Belegdatum"> <Form name="WEAR">Lieferschein_Datum</Form> <Form name="KOAU">Belegdatum</Form> </DateMap> </importkennungen> Der Code dazu sieht so aus:
Delphi-Quellcode:
Aber XMLNode ist immer nil. Der XPath müsste aber stimmen oder habe ich da noch einen Fehler drinne? Ich verstehe es einfach nicht.
s := Format('/importkennungen/DateMap/Form[@name="%s"]', [FormName]); // FormName = WEAR
XMLNode := XMLDoc.selectSingleNode(s); // Formname gefunden, konfigurierten Wert nehmen if Assigned(XMLNode) then begin result := XMLNode.text; end // FormName nicht gefunden Default-Wert nehmen else begin XMLNode := XMLDoc.selectSingleNode('/importkennungen/DateMap/@default'); if Assigned(XMLNode) then result := XMLNode.text; end; Der plöde Parser ist mit einem Umlaut in einem Kommentar nicht klar gekommen. Fiorefox hat es richtig angezeigt, aber der IE nicht. :wall: Jetzt geht es. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:24 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