tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
3
ZUGRIFFE
1389
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Tikonteroga Tikonteroga ist offline Mitglied Gold
    Registriert seit
    Apr 2007
    Beiträge
    153
    Hallo,

    wenn ich ein XML-Schema erstelle und einige Elemente mit minoccurs="1" definiere und für nicht optionale Attribute einen Default-Wert definiere, ist es dann möglich aus diesem XML-Schema eine XML-Instanz zu erstellen? Also im Prinzip als wenn ich von einer Klasse den Default-Konstruktor aufrufe.

    Die Elemente mit minOccures="1" sowie die Attribute für die ein Default-Wert definiert wurde sollen dann in dieser Instanz bereits vorhanden sein.

    Gibt es hierfür eine Bibliothekesfunktion oder muss ich das händisch machen und das XML-Schema durchrödeln ?
     

  2. #2
    Martin Honnen Martin Honnen ist offline Mitglied Bronze
    Registriert seit
    Dec 2011
    Beiträge
    30
    So du unter Windows mit .NET 2.0 oder neuer arbeitest, könnte dich http://msdn.microsoft.com/en-us/library/aa302296.aspx interessieren, damit kannst du zu einem Schema oder einer Menge von Schemata ein Beispieldokument generieren.
     

  3. #3
    Tikonteroga Tikonteroga ist offline Mitglied Gold
    Registriert seit
    Apr 2007
    Beiträge
    153
    Hallo,

    ich habe mal versucht mit .NET (C#) aus einer XmlSchema Instanz ein XmlDocument zu erstellen.

    Dabei wäre dies die Methoden-Signatur.

    Code :
    1
    
    public static XmlDocument newInstance(XmlSchema schema);

    Dabei habe ich nach einer möglichkeit gesucht, das XmlSchema rekursiv beginnend beim Element, welches das Root-Element darstellt elementweise abzuarbeiten.

    Dabei hab ich mir das so vorgestellt, dass ich bei dem xs:element beginne welches das Root-Element beschreibt und dann die Kind-Elemente und deren Kindelemente rekursiv abarbeite. Wenn ein xs:element die Eigenschaft minOccurres="n" (n >= 1) hat erstelle ich diese Elemente im XmlDocument und vergebe ggfs. noch Default-Werte für die Attribute.

    Aber ich bin nicht mal soweit gekommen, dass ich das Root-Element im XmlSchema gefunden habe. Ausserdem habe ich immer nur die Parent-Eigenschaft gefunden, jedoch nie eine Childs Eigenschaft ...

    Beim Recherchen habe ich oft etwas über die Compile Methode gelesen und dass diese ein logisches Schema erstellt. Bei mir hatte die Compile Methode jedoch scheinbar keinen erkennbaren Effekt.
    Geändert von Tikonteroga (26.01.12 um 08:07 Uhr)
     

  4. #4
    Martin Honnen Martin Honnen ist offline Mitglied Bronze
    Registriert seit
    Dec 2011
    Beiträge
    30
    Wenn du das Sample von http://msdn.microsoft.com/en-us/library/aa302296.aspx benutzt, ergibt sich folgende Nutzungsmöglichkeit:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.Xml.Linq;
    using System.Xml.Schema;
    using Microsoft.Xml.XMLGen;
     
    namespace XmlInstanceGenTest1
    {
        class Program
        {
            static void Main(string[] args)
            {
                XmlSchemaSet schemas = new XmlSchemaSet();
                schemas.Add(null, "../../XMLSchema1.xsd");
                XmlSampleGenerator gen = new XmlSampleGenerator(schemas, new XmlQualifiedName("root", "http://example.com/ns1"));
     
                XDocument doc = new XDocument();
                using (XmlWriter xw = doc.CreateWriter())
                {
                    gen.WriteXml(xw);
                }
     
                doc.Save(Console.Out);
                Console.WriteLine();
     
                gen.MaxThreshold = 1;
     
                doc = new XDocument();
                using (XmlWriter xw = doc.CreateWriter())
                {
                    gen.WriteXml(xw);
                }
                doc.Save(Console.Out);
            }
        }
    }
    Mit einem Beispielschema
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://example.com/ns1" elementFormDefault="qualified">
      <xs:element name="root">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="foo" maxOccurs="unbounded">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="bar" type="xs:string"/>
                </xs:sequence>           
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    ergibt sich dann das Resultat
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    <?xml version="1.0" encoding="ibm850"?>
    <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://example.com/ns1">
      <foo>
        <bar>bar1</bar>
      </foo>
      <foo>
        <bar>bar2</bar>
      </foo>
      <foo>
        <bar>bar3</bar>
      </foo>
      <foo>
        <bar>bar4</bar>
      </foo>
      <foo>
        <bar>bar5</bar>
      </foo>
    </root>
    <?xml version="1.0" encoding="ibm850"?>
    <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://example.com/ns1">
      <foo>
        <bar>bar1</bar>
      </foo>
    </root>
    So du mit .NET 2.0 oder 3.0 arbeitest und nicht XDocument nutzen kannst oder willst, besteht natürlich auch die Möglichkeit, XmlDocument zu nutzen:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
                XmlSchemaSet schemas = new XmlSchemaSet();
                schemas.Add(null, "../../XMLSchema1.xsd");
                XmlSampleGenerator gen = new XmlSampleGenerator(schemas, new XmlQualifiedName("root", "http://example.com/ns1"));
     
                XmlDocument doc = new XmlDocument();
                using (XmlWriter xw = doc.CreateNavigator().AppendChild())
                {
                    gen.WriteXml(xw);
                }
     
                doc.Save(Console.Out);
                Console.WriteLine();
     
                gen.MaxThreshold = 1;
     
                doc = new XmlDocument();
                using (XmlWriter xw = doc.CreateNavigator().AppendChild())
                {
                    gen.WriteXml(xw);
                }
                doc.Save(Console.Out);
     

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 14.08.10, 12:11
  2. Class aus String-Value instanzieren?
    Von Marine-of-Hell im Forum Java
    Antworten: 3
    Letzter Beitrag: 27.07.09, 12:12
  3. Instanzieren von generischen Typen
    Von xxsaikoxx im Forum Java
    Antworten: 3
    Letzter Beitrag: 30.12.07, 11:14
  4. Symbol aus Bibliothek instanzieren
    Von Samy-Deluxe im Forum Flash Plattform
    Antworten: 1
    Letzter Beitrag: 26.06.06, 10:58
  5. Oracle - Tabelle von einem Schema in ein anderes Schema verschieben
    Von Plumpsi im Forum Relationale Datenbanksysteme
    Antworten: 0
    Letzter Beitrag: 15.09.04, 10:26