C# LINQ to XML (Nullwerte)

Nordlicht321

Cadet 1st Year
Registriert
Jan. 2015
Beiträge
10
Hallo Leute,

ich habe eine XML die ähnlich wie die folgende aufgebaut ist.

HTML:
<Personen>
<Person>
<Vorname>Klaus</Vorname> [u]
<Zuname>Meier</Zuname>
<Alter>20</Alter>
<Adresse Ort="Köln" Postleitzahl="57848" Strasse="Bahnhofstr.6" />
</Person>

<Person>
<Vorname>Petra</Vorname>
<Zuname>Schmidt</Zuname>
<Alter>43</Alter>
<Adresse Ort="Düsseldorf" />
</Person>
<Person>

<Vorname>Rolf</Vorname>
<Zuname>Klose</Zuname>
<Alter>66</Alter>
<Adresse Ort="Frankfurt" Strasse="Hanauerstr.78" />
</Person>
</Personen>

Hier möchte ich jetzt von allen Elementen die Attribute auslesen. Bei den Elementen Vorname, Zuname und Alter ist das auch kein Problem nur bei den Elementen/Attributen von Adresse weiß ich nicht wie vorgehen soll! Wie kann ich dem Programm sagen das es den Wert 0 ausgeben soll wenn ein Element nicht gefunden wurde ohne das das Programm vorher abbricht?

Hier ein Codeausschnitt von mir:

Code:
XDocument XMLPerson = XDocument.Load("Per.FileName")

var Leuten = from Leute in XMLPerson.Descendants("Person")
select new
{
LVorname = (string) Leute.Attribute ("Vorname"),
LZuname = (string) Leute.Attribute ("Zuname"),
LAlter = (string) Leute.Attribute ("Alter"),

LAdresse = Leute.Elements ("Adresse")
};

foreach (var Leute in Leuten)
{
...

Danke für die Hilfe!
 
Ungetestet: Du kannst im LINQ folgendes tun:

Code:
LVorname = (string) Leute.Attribute ("Vorname") ?? "0",
LZuname = (string) Leute.Attribute ("Zuname") ?? "0",
LAlter = (string) Leute.Attribute ("Alter") ?? "0",

Der "??"-Operator gibt jetzt entweder das Attribut aus sofern dies nicht NULL ist oder sonst eben "0".

Was alternativ auch klappen sollte ist folgendes:
Im LINQ lässt du den (string)-cast weg also:
Code:
LVorname = Leute.Attribute ("Vorname"),
LZuname = Leute.Attribute ("Zuname"),
LAlter = Leute.Attribute ("Alter"),

und im foreach-Block machst du sowas wie:
Code:
if (!String.isnullorempty(Leute.LVorname)) {
//Es war ein Vorname vorhanden
}
 
Zuletzt bearbeitet:
Okay danke werde ich gleich mal ausprobieren!
Kann ich mir die Postleitzahl in der Form auch als double ausgeben lassen?
 
Zunächst mal ist die Postleitzahl eine Zeichenkette von Buchstaben. Natürlich könntest du das in ein integer parsen. Double macht hier wohl keinen Sinn, die sind eher für Kommazahlen geeignet. Dann müsstest du aber noch ein geeignetes Exception-Handling einbauen, falls in dem Feld mal etwas anderes steht als Ziffern.
 
Eine Postleitzahl würde ich nicht als Zahl betrachten (weder Integer noch Double), weil dann standardmäßig die evtl. führende 0 wegfällt (und damit Teile Deutschlands wieder in die Zeit der vierstelligen PLZ zurückversetzt werden). Im Ausland können PLZ zudem auch Buchstaben enthalten.
Deshalb: PLZ immer als String behandeln.

Wenn du dennoch einen String als Doube parsen möchtest, ist Double.TryParse die sauberste Methode.
 

Ähnliche Themen

Antworten
7
Aufrufe
2.525
R
Zurück
Oben