Partager via


XFDF XML mit C# und einem Schema validieren ...

In meinen letzten Blogseintrag "XFDF Felder mit C# lesen ..." habe ich über meine ersten Erfahrungen mit XFDF berichtet. Das Projekt schreitet voran und ich habe noch einige interessante Dinge XFDF mit .NET und Visual Studio 2008 zu berichten.

Um die eingegangen XML XFDF Daten sinnvoll zu verarbeiten, wollte ich mit folgendem Code die XML Daten mit dem offiziellen XSD Schema von Adobes Website validieren.

  try

            {

                // Create a schema set

            XmlSchemaSet sc = new XmlSchemaSet();

                // Add the schema to the collection.

                sc.Add( "https://ns.adobe.com/xfdf/", @”xfdf.xsd" );

                // Set the validation settings.

                XmlReaderSettings settings = new XmlReaderSettings();

                settings.ValidationType = ValidationType.Schema;

                settings.Schemas = sc;

                settings.ConformanceLevel = ConformanceLevel.Document;

                // Create a validating reader

                XmlReader reader = XmlReader.Create( new StringReader( inputXmlString ), settings );

                // Create the XmlReader object.

                XmlSerializer ser = new XmlSerializer( typeof( V1.xfdf ) );

                // Create the object from the XML string with VALIDATION

                V1.xfdf o = ser.Deserialize( reader ) as V1.xfdf;

                reader.Close();

                if ( o != null )

                {

                    foreach ( object of in o.Items )

                    {

                        System.Diagnostics.Trace.WriteLine( of );

                        if ( of is GenerateDDLfromXfdf.V1.xfdfFields )

                        {

                            V1.xfdfFields fields = of as V1.xfdfFields;

                    foreach ( V1.field f in fields.field )

                            {

                                ProcessV1Fields( f, string.Empty );

                            }

                        }

                    }

                }

            }

            catch ( InvalidOperationException ioEx )

            {

                if ( ioEx.InnerException != null && ioEx.InnerException is XmlSchemaValidationException )

                {

                    // TODO: do something usefull with the error information in the XmlSchemaValidationException object

                }

                System.Diagnostics.Trace.WriteLine( ioEx.ToString() );

            }

            catch ( Exception ex )

            {

                System.Diagnostics.Trace.WriteLine( ex.ToString() );

            }

Allerdings scheint das Schema auf Adobes Website nicht 100% zu funktionieren. Wenn ich das Original XFDF Schema verwende, bekomme ich eine XmlSchemaValidationException mit der Meldung "The group ref to 'all' is not the root particle, or it is being used as an extension.“, d.h. .NET beurteilt das XSD Schema selbst als invalid.

Zuerst habe ich das Original XFDF Schema auf folgenden Websites geprüft:

1. https://www.validome.org/grammar/validate - Ergebnis = Schema ist falsch

2. https://www.w3.org/2001/03/webdata/xsv - Ergebnis = Schema ist valid

Das Ergebnis hat mir auch nicht weiter geholfen, und so habe ich die Meldung der XmlSchemaValidationException interpretiert und folgende Änderung vorgenommen. Die Definition der xs:group name=“value.group.type“ enthält eine xs:all Deklaration. Diese habe ich durch eine xs:sequence Deklaration ausgetauscht. Die neue Definition sieht so aus:

<xs:group name="value.group.type">

    <!-- modified -->

    <xs:sequence>

             <xs:element name="value" type="value.elem.type" minOccurs="0"/>

             <xs:element name="value-richtext" type="richtext.elem.type" minOccurs="0"/>

    </xs:sequence>

  </xs:group>

Mit dieser kleinen Änderung lassen sich nun die einkommenden XFDF XML Daten mit einem Schema validieren.

Viel Spass beim Validieren … GunnarD

Comments