Laden...

Wie kann ich eine XML lesen und die Werte speichern?

Erstellt von toba vor 4 Jahren Letzter Beitrag vor 4 Jahren 839 Views
T
toba Themenstarter:in
4 Beiträge seit 2020
vor 4 Jahren
Wie kann ich eine XML lesen und die Werte speichern?

Servus,
ich bin noch ein relativer Anfänger im Programmieren.
Jetzt wollte ich mal versuchen eine XML über C# einzulesen und bestimmte werte herauszufiltern und abzuspeichern.
Leider weiß ich nicht so ganz wie das funktionieren soll.

Die XML die eingebunden werden soll, sieht dabei so aus:

<Data>
<SomeData>
<Content A="2" B="3" C="1" D="4" />
<Content A="2" B="6" C="1" D="9" />
<Content A="2" B="10" C="1" D="14" />
</SomeData>
</Data>

Was ich brauche sind Zahlen von A,B,C,D.

4.942 Beiträge seit 2008
vor 4 Jahren

Hallo und willkommen,

es gibt zwei verschiedene Ansätze: XmlDocument und XDocument.

Einen kurzen Vergleich beider gibt es von Abt in C# XML: die perfekte Mischung!

Weitere (meist englische) Tutorials gibt es massenweise im Internet.

Die Werte A,B,C,D heißen im XML-Jargon Attribute.

T
toba Themenstarter:in
4 Beiträge seit 2020
vor 4 Jahren

Das mit dem Attributen habe ich hinbekommen.
Jetzt ist es so das ich nach TDD entwickeln möchte bzw. mich mal da reinhängen möchte.
Einige Tests klappen auch wunderbar.
Jetzt habe ich ein Problem bei einem bestimmten Test.

Mein Test der wie Folgt aussieht:

[TestCase(2, 10, 1, 14)]
        [TestCase(3, 80, 1, 107)]
        public void DetermineDTargetTest(int a, int b, int c, int expectedResult)
        {
            var filename = Path.Combine(TestContext.CurrentContext.TestDirectory, "Files", "File.xml");
            var xdoc = XDocument.Load(filename);
            var spoolValveInfos = SpoolValveInfos.TransformXML(xdoc);

            var sut = SpoolValveInfos.DetermineDTarget(spoolValveInfos, a, b, c);

            Assert.That(sut, Is.EqualTo(expectedResult));
        }

und meine Methode:

        public static int DetermineDTarget(IEnumerable<SpoolValveInfo> spoolValveInfos, int a, int b, int c)
        {
            return 14;
        }

anbei noch die Methode die die XML einliest:

        public static IEnumerable<SpoolValveInfo> TransformXML(XDocument xdoc)
        {
            return from i in xdoc.Descendants("Content")
                   select new SpoolValveInfo
                   {
                       A= int.TryParse(i.Attribute("A").Value, out var a) ? a: 0,
                       B = int.TryParse(i.Attribute("B").Value, out var b) ? b : 0,
                       C= int.TryParse(i.Attribute("C").Value, out var c) ? c: 0,
                       D= int.TryParse(i.Attribute("Dl").Value, out var d) ? d: 0
                   };
        } 

Der Test mit dem expectedResult "14" geht natürlich durch.
Jetzt möchte ich halt das 14 und 107 durchgehen.
Mein Kopf ist gerade matsche und komme gerade nicht wirklich weiter 😕