Infopath und xsi:nil

You find a lot of information about the issues of the xsi:nil attribute when using Infopath.

schreibt und damit endet die Reihe der Beiträge auf dieser Website auch schon wieder (ein Artikel und Schluss…). Also sicher nichts fürs Abo, aber trotzdem sehr hilfreich nach meiner langen Suche nach einer Fehlermeldung beim per-Code setzen eines Datums in einem Infopath Datumsfeld. Und unterstützen kann ich die Aussage leider auch nur bedingt, man muss nämlich zunächst mal finden, nach was man eigentlich sucht.

Die Problemstellung war eigentlich simpel:

Nimm einen als Datum deklarierten XML Knoten und ersetze (passende) Datumsfelder in darunterliegenden XML Knoten gleicher Art mit dem Inhalt dieses Felds.

Nur die Fehlermeldung, die ich da bekam, war mir irgendwie nicht so klar: ‘#PCDATA’ ist Null-Inhalt. Dies aus einem einfachen Grund: ich hatte scheinbar nirgends etwas, das ich mit #PCDATA in Verbindung gebracht hätte. Wenn einem sowas bie Infopath dann ausgerechnet bei einem Datumsfeld unterkommt (Infopath, Sharepoint und das Datumsformat sind ja schließlich auch so eine Sache für sich), dann sucht man zunächst mal in der Richtung.

Laut heißt es:

XML Schema: Structures introduces a mechanism for signaling that an element should be accepted as valid when it has no content despite a content type which does not require or even necessarily allow empty content. An element may be valid without content if it has the attribute xsi:nil with the value true. An element so labeled must be empty, but can carry attributes if permitted by the corresponding complex type.

Was man also hätte wissen müssen (oder auch hätte nachlesen können zum Beispiel in der template.xml Datei): Infopath versieht bestimmte Dateitypen mit dem Attribut xsi:nil = true. Weiß man das nicht, sucht man natürlich zunächst verzweifelt nach einem Anhaltspunkt.

Die von Infopath mit dem xsi:nil Attribut versehenen Datentypen sind:

  • Ganzzahlen (integer)
  • Dezimalzahlen(double)
  • Datum (date)
  • Zeit (time)
  • Datum und Zeit (dateTime)

Um nun bei meinKnoten.text = meinWert die Fehlermeldung loszuwerden, gibt es im Wesentlichen wahrscheinlich Varianten:

  1. meinKnoten.removeAttribute(’xsi:nil’);
  2. meinKnoten.setAttribute(’xsi:nil’, ‘false’), dann den Wert setzen, dann meinKnoten.setAttribute(’xsi:nil’, ‘true’)

wobei ich denke, Variante 2 ist der ersten deutlich vorzuziehen.

Manchmal ist man echt ein bisschen blind…

 

Auch was dazu sagen?