XML-Schema instanzieren

Tikonteroga

Erfahrenes Mitglied
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 ?
 
Hallo,

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

Dabei wäre dies die Methoden-Signatur.

Code:
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.
 
Zuletzt bearbeitet:
Wenn du das Sample von http://msdn.microsoft.com/en-us/library/aa302296.aspx benutzt, ergibt sich folgende Nutzungsmöglichkeit:
Code:
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:
<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:
<?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:
            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);
 

Neue Beiträge

Zurück