Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi XML-Node mit NULL-Wert füllen (per MSXML) (https://www.delphipraxis.net/58376-xml-node-mit-null-wert-fuellen-per-msxml.html)

alzaimar 6. Dez 2005 10:07


XML-Node mit NULL-Wert füllen (per MSXML)
 
Wir haben hier ein XML-Dokument (Importiert mit Delphi 6.0). Einer der Knoten ist als decimal (nillable=true) definiert. Wenn wir diesem Knoten den Wert 'NULL' zuweisen und das XML-Dokument erzeugen, steht da:
XML-Code:
<MyNode/>
Da soll aber stehen
XML-Code:
<MyNode xsi:nil="true" xmlns:xsi="http//www.w3.org/2001/XMLSchema-instance"/>
Unabhängig davon das es wohl schwachsinnig ist, für ein 'Nichts' so viel Text zu verschicken, fragen wir uns, wie wir MSXML 2.0 dazu bekommen, diesen "xsi:nil="true"... "-Quatsch zu erzeugen? Die Gegenseite (Java) akzeptiert nämlich nur das...

Da sich die Struktur der XML-Dokumente laufend ändert, bräuchten wir eine allgemeingültige Lösung. Derzeit behelfen wir uns nämlich mit 'StrReplace', was ja wohl nicht sein kann... :wall:

Danke schonmal für Mühe und Anteilnahme

marabu 6. Dez 2005 13:37

Re: XML-Node mit NULL-Wert füllen (per MSXML)
 
Hallo alzaimar,

Zitat:

Zitat von alzaimar
Wir haben hier ein XML-Dokument (Importiert mit Delphi 6.0). Einer der Knoten ist als decimal (nillable=true) definiert. Wenn wir diesem Knoten den Wert 'NULL' zuweisen und das XML-Dokument erzeugen,

was steht in der Uses Klausel - MSXML oder MSXML2? Kannst du noch die 3 Zeilen Code angeben, mit denen du den Knoten auf NULL setzt und das XML-Dokument erzeugst? Ich stehe sonst etwas im Dunkeln.

Grüße vom marabu

alzaimar 6. Dez 2005 13:51

Re: XML-Node mit NULL-Wert füllen (per MSXML)
 
Hi marabu,

Entschuldigung, wir verwenden den Object-Wrapper (XML Data Binding) von Delphi, um auf die Knoten zuzugreifen. Die Zuweisung ist so:
Delphi-Quellcode:
uses xmldom, XMLDoc, XMLIntf;
...
MyXMLNode.ChildNodes['BasePriceUsed'].NodeValue := Null;
Das XML-Paket/Dokument holen wir uns über
Delphi-Quellcode:
MyXMLNode.XML
Ich persönlich finde ja das '<BasePriceUsed/>' völlig in Ordnung, aber die Java-Seite nicht. Und das kurz vor Weihnachten :wink:

Kannst Du helfen?

marabu 6. Dez 2005 17:05

Re: XML-Node mit NULL-Wert füllen (per MSXML)
 
Hi alzaimar,

wenn du den NodeValue auf Null setzt, dann werden existierende Attribute nicht angefasst - die müssen vorher schon gefehlt haben. Du musst die Attribute einfach irgendwann zugeben:

Delphi-Quellcode:
with MyXMLNode.ChildNodes['BasePriceUsed'] do
begin
  setAttribute('xsi:nil', 'true');
  NodeValue := Null;
end;
Grüße vom marabu

alzaimar 6. Dez 2005 17:19

Re: XML-Node mit NULL-Wert füllen (per MSXML)
 
Hach marabu, wat würd'ick ohne Dir bloss tun?
:cheers: wenn Du mal in der Nähe bist ;-)

alzaimar 8. Dez 2005 19:27

Re: XML-Node mit NULL-Wert füllen (per MSXML)
 
Halt, zu früh gefreut:
Ich kann das Attribut 'xsi:nil' auf "True" setzen, aber beim Versuch, das zweite Attribut ('xmlns:xsi') zu setzen, tritt ein Fehler auf (das Attribut ist schreibgeschützt, so so)... Wie macht das denn nun?

Hat sich erledigt, ich schaff das so:
Delphi-Quellcode:
With MyNode do Begin
  SetAttributeNS('xsi:nil','http://www.w3.org/2001/XMLSchema-instance','true');
  NodeValue := Null;
End;
Ok so?

marabu 8. Dez 2005 20:48

Re: XML-Node mit NULL-Wert füllen (per MSXML)
 
Hallo alzaimar,

Zitat:

Zitat von alzaimar
aber beim Versuch, das zweite Attribut ('xmlns:xsi') zu setzen, tritt ein Fehler auf (das Attribut ist schreibgeschützt, so so)... Wie macht das denn nun?

nur beim Versuch eine vorhandene NameSpace-Deklaration zu ändern wird diese Exception geworfen. Einmal darfst du schon.

Delphi-Quellcode:
With MyNode do Begin
  SetAttributeNS('xsi:nil','http://www.w3.org/2001/XMLSchema-instance','true');
  NodeValue := Null;
End;
Was willst du damit bezwecken? Der NameSpaceURI wird in der Regel beim DocumentElement deklariert - alle childNodes mit entsprechendem Präfix erben den NameSpaceURI. Unter dieser Voraussetzung wird dein hier gezeigter Code keinen Fehler werfen, aber du wirst den NameSpaceURI auch nicht sehen, wenn du dir den erzeugten XML-Code anschaust - wegen der Vererbung.

Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:10 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