none
XML Datei aus Muster erstellen und auslesen, Konzepte RRS feed

  • Frage

  • Hallo,

    ich habe als Vorgabe eine XML Datei, die ich erzeugen muss, soll.
    Welche Klasse, Funktionen würden sich hier eignen?

    A) Man könnte ein Dataset über XSD irgendwie erzeugen.
    B)     Danke für Tipps im Voraus.
       Einfach, dass man ein Schema für den Beginn hat.

    <?xml version="1.0" encoding="Windows-1252"?>
    <Pattern xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    	<Program>1612</Program>
    	<DateSpecialFormat>20306</DateSpecialFormat>
    	<Shift>2</Shift>
    	<RefPanel>
    		<Value>97</Value>
    	</RefPanel>
    	<RefTeil>
    		<Values Joghurt="true" Milchprodukt="true" />
    		<Values LorenzSalzstange="true" Milchprodukt="false" />
    	</RefTeil>
    	<ID>0660</Board>
    	<Code>931122203062990000009700</Code>
    	<event>
    		<ModeChanged modeOn="true" operationMode="3" Version="8" shift="2" charge="XY"  />
    	</event>
    </Pattern>

    Rechts welche Funktionen eignen sich hierfür.
    Dann würde das recht schnell gehen.

    D) Mustertelegramm, -datei      -- Rechts

    •     Erzeugen mit Objext XMLDocument
    • Elemente am besten, so
    • Attribute am besten, so

    E) Wie lese ich das am schnellsten aus.

    LorenzSalzstange ist das ein Milchprodukt?

    Danke.

    Grüße Oliver

    Mittwoch, 7. März 2012 10:41

Antworten

  • Hallo Oliver,

    Es gibt diverse Möglichkeiten, Attribute auszulesen, aber bleiben wir bei System.Xml.Linq:

    var val = xDocument.Descendants("Values").Attributes("Joghurt").FirstOrDefault();
    Console.WriteLine("\nJoghurt: {0}", val == null ? "n.v." : val.Value);
    Natürlich kann man dafür auch XPath verwenden:

    using System.Xml.Linq;
    using System.Xml.XPath;
    using System.Collections;
    // [...]
    var enumeration = (IEnumerable)xDocument.XPathEvaluate("//@Joghurt"); 
    var attribut = enumeration.Cast<XAttribute>().FirstOrDefault();
    Console.WriteLine("\nJoghurt: {0}", attribut == null ? "n.v." : attribut.Value);

    Gruß
    Marcel

    • Als Antwort markiert O. Stippe Mittwoch, 7. März 2012 20:47
    Mittwoch, 7. März 2012 16:45
    Moderator

Alle Antworten

  • Mit Visual Studio http://msdn.microsoft.com/en-us/library/ms255810.aspx kann man zu einem XML-Dokument ein Schema generieren (oder man kann das mit dem xsd.exe Tool von der Kommandozeile machen), dann kann man mit xsd.exe http://msdn.microsoft.com/en-us/library/x6c1kb0s.aspx von der Kommandozeile Code mit C# Klassen generieren lassen, die man zum Projekt hinzufügt. Dann kann man in C# mit Instanzen dieser Klassen arbeiten und diese per System.Xml.Serialization.XmlSerializer als XML-Dokument serialisieren.

    Wenn ich mir das XML-Beispiel, das du gepostet hast, aber ansehe, bin ich nicht sicher, ob die Verwendung eines Schema funktionieren wird, dann du Attributnamen wie "Joghurt" oder "LorenzSalzstange" hast, die eher nach Daten aussehen. Im Schema wird man die möglichen Elemente und Attributnamen festlegen müssen.

    Ansonsten gibt es seit .NET 3.5 noch LINQ to XML .


    MVP Data Platform Development My blog

    Mittwoch, 7. März 2012 12:17
  • Ein LINQ to XML-Beispiel (von Martin bereits angesprochen):

    using System;
    using System.Xml.Linq;
    namespace XDocDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Xml-Dokument erstellen
                XDocument xDocument = new XDocument(
                    new XDeclaration("1.0", "Windows-1252", null),
                    new XElement("Pattern",
                        new XAttribute(XNamespace.Xmlns + "xsd", "http://www.w3.org/2001/XMLSchema"),
                        new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"),
                        new XElement("Program", "1612"),
                        new XElement("DateSpecialFormat", "20306"),
                        new XElement("Shift", "2"),
                        new XElement("RefPanel", new XElement("Value", "97")),
                        new XElement("RefTeil", new XElement("Values",
                            new XAttribute("Joghurt", "true"),
                            new XAttribute("LorenzSalzstange", "true"))),
                        new XElement("ID", "0660"),
                        new XElement("Code", "931122203062990000009700"),
                        new XElement("event",
                            new XElement("ModeChanged",
                                new XAttribute("modeOn", "true"),
                                new XAttribute("operationMode", "3"),
                                new XAttribute("version", "8"),
                                new XAttribute("shift", "2"),
                                new XAttribute("charge", "XY")))));
                // Xml-Dokument anzeigen            
                Console.WriteLine(xDocument.ToString());
                Console.ReadKey(true);
            }
        }
    }

    Übersicht über LINQ to XML:
    http://msdn.microsoft.com/de-de/library/bb387061.aspx

    Gruß
    Marcel

    Mittwoch, 7. März 2012 12:37
    Moderator
  • Hallo Marcel,

    das sieht ja einfach aus.

     new XElement("RefPanel", new XElement("Value", "97")),
                        new XElement("RefTeil", new XElement("Values",
                            new XAttribute("Joghurt", "true"),
                            new XAttribute("LorenzSalzstange", "true"))),

    Eine Bitte noch,

    OK, wenn ich jetzt die Eigenschaft von Joghurt wissen will?

    Sprich auslesen.

    Wird ähnlich gehen, oder?

    Du weißt es, dann muss ich nicht lange suchen.

    Das Erzeugen, wenn man es weiß, schnell, ich hätte länger benötigt. DANKE.

    Gruß, Oliver

    Mittwoch, 7. März 2012 16:06
  • Wenn ich mir das XML-Beispiel, das du gepostet hast, aber ansehe, bin ich nicht sicher, ob die Verwendung eines Schema funktionieren wird, dann du Attributnamen wie "Joghurt" oder "LorenzSalzstange" hast, die eher nach Daten aussehen. Im Schema wird man die möglichen Elemente und Attributnamen festlegen müssen


    Hallo Martin,

    ja hast Recht!

    Joghurt ist eher der Typ.

    Gibt es fürs Schema ähnliche schnelle Ansätze?

    Sprich true oder false, oder Bereiche festlegen  -5.56 bis 30.9

    oder MinPreis = 0.29€ bis 0,49€

    Grüße Oliver

    Mittwoch, 7. März 2012 16:09
  • Hallo Oliver,

    Es gibt diverse Möglichkeiten, Attribute auszulesen, aber bleiben wir bei System.Xml.Linq:

    var val = xDocument.Descendants("Values").Attributes("Joghurt").FirstOrDefault();
    Console.WriteLine("\nJoghurt: {0}", val == null ? "n.v." : val.Value);
    Natürlich kann man dafür auch XPath verwenden:

    using System.Xml.Linq;
    using System.Xml.XPath;
    using System.Collections;
    // [...]
    var enumeration = (IEnumerable)xDocument.XPathEvaluate("//@Joghurt"); 
    var attribut = enumeration.Cast<XAttribute>().FirstOrDefault();
    Console.WriteLine("\nJoghurt: {0}", attribut == null ? "n.v." : attribut.Value);

    Gruß
    Marcel

    • Als Antwort markiert O. Stippe Mittwoch, 7. März 2012 20:47
    Mittwoch, 7. März 2012 16:45
    Moderator