XmlAttribute, Single-Line und Operator ??



  • Hi,

    ich habe recht viele Attribute, die ich aus ner XML-Datei lese. Viele davon sind Optional andere sind Pflicht.

    Für die Optionalen gibt es default-Werte, je nach Attribut-Name.

    Beim Optionalen muss ich immer erst fragen: "Ist das Attribut vorhanden, wenn ja: Nimm den wert, ansonsten default.".

    Das sieht aktuell so aus:

    if (node.HasAttribute ("name"))
        value = node.Attributes["name"].Value;
    else
        value = "default-wert";
    

    Da mir das bei ca. 50 optionalen auf dauer etwas zu viel wird, habe ich eine Single-Line Operation geschrieben:

    value = node.HasAttribute ("name") ? node.Attributes["name"].Value : "default-wert";
    

    Damit bin ich aber auch nicht zufrieden, da ich den Attributnamen 2x angeben muss und die Zeile doch sehr lang ist und auf dauer unübersichtlich.

    Jetzt hab ich in der Doku was vom ??-Operator gelesen und wollte folgendes Konstrukt herleiten, doch das will nicht, da XmlAttribute einen protected Constructor hat - der leider auch nicht direkt passend ist.

    value = (node.Attributes["name"] ?? new XmlAttribute ("default-wert")).Value;
    

    Hat jemand eine gute Idee, das schön zu bewerkstelligen? 🙂

    Danke im voraus! 🙂



  • Ich kenne den op ?? in der Praxis nicht. Aber oben gibst Du einfach einen String an value. Klappt das hier nicht ?

    value = (node.Attributes["name"] ?? "default-wert");
    


  • Das ist leider nicht möglich, da Attributes[""] einen XmlAttribute wiedergibt.

    Daher bekomm ich folgenden Fehler bei deinem Code:

    Error	1	Operator '??' cannot be applied to operands of type 'System.Xml.XmlAttribute' and 'string'
    

    Ich muss also bei XmlAttribute auf "Value" zugreifen um den Wert zu bekommen.



  • Möp, jetzt verstehe ich das Problem , sorry lange benötigt.

    Was spricht denn gegen eine Methode der Du die Collection und den Namen und den default Wert übergibst. Diese Methode kann dann das if else Konstrukt durchführen und den gewünschten Wert zurück liefern.

    value = Methode(node.Attributes,"name","default-value");
    


  • Wenn ich mich recht erinnere hat der XMLReader bereits so eine Funktion, kann mich aber irren und kann hier gerade nicht nachschauen.


Anmelden zum Antworten