Avatar billede halden Nybegynder
26. august 2008 - 09:38 Der er 14 kommentarer og
1 løsning

XmlDataDocument validate

Hej,
jeg skal validere en xml mod et schema men får bare af vide at "Elementet 'kunder' er ikke erklæret".

Xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<kunder>
  <kunde nummer="1000006" sidstopdateret="01.02.2007">
  <navn>ACTION A/S</navn>
  <fremmednavn></fremmednavn>
  <kontaktperson></kontaktperson>
  <email></email>
  <telefon>39273133</telefon>
  <telefax>39273223</telefax>
  <eumomsnr></eumomsnr>
  <fakturaadresse>
    <adresse1>TUBORG BOULEVARD 10</adresse1>
    <postnummer>2900</postnummer>
    <by>HELLERUP</by>
    <land>DANMARK</land>
  </fakturaadresse>
</kunde>

XSD:
<?xml version="1.0" encoding="iso-8859-1"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="kunder">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" name="kunde">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="navn" type="xs:string" />
                            <xs:element name="fremmednavn" />
                            <xs:element name="kontaktperson" type="xs:string" />
                            <xs:element name="email" type="xs:string" />
                            <xs:element name="telefon" type="xs:string" />
                            <xs:element name="telefax" type="xs:string" />
                            <xs:element name="eumomsnr" type="xs:string" />
                            <xs:element name="fakturaadresse">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="adresse1" type="xs:string" />
                                        <xs:element name="postnummer" type="xs:string" />
                                        <xs:element name="by" type="xs:string" />
                                        <xs:element name="land" type="xs:string" />
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                        <xs:attribute name="nummer" use="required">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:pattern value="([a-åA-Å0-9])*"/>
                                    <xs:minLength value="1"/>
                                    <xs:maxLength value="15"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:attribute>
                        <xs:attribute name="sidstopdateret" type="xs:string" use="required" />
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Hvad gør jeg galt?
Avatar billede tripwire Nybegynder
26. august 2008 - 09:47 #1
skal nederste linie af xml dokumentet ikke være </kunder> ?
Avatar billede halden Nybegynder
26. august 2008 - 09:48 #2
det er den også - bare glem at kopiere det ind :)
Avatar billede halden Nybegynder
26. august 2008 - 09:50 #3
<?xml version="1.0" encoding="ISO-8859-1"?>
<kunder>
  <kunde nummer="1000006" sidstopdateret="01.02.2007">
  <navn>ACTION A/S</navn>
  <fremmednavn></fremmednavn>
  <kontaktperson></kontaktperson>
  <email></email>
  <telefon>39273133</telefon>
  <telefax>39273223</telefax>
  <eumomsnr></eumomsnr>
  <fakturaadresse>
    <adresse1>TUBORG BOULEVARD 10</adresse1>
    <postnummer>2900</postnummer>
    <by>HELLERUP</by>
    <land>DANMARK</land>
  </fakturaadresse>
  </kunde>
</kunder>
Avatar billede halden Nybegynder
26. august 2008 - 10:03 #4
koden jeg bruger er:

System.Xml.Schema.XmlSchema xmlSchema = new System.Xml.Schema.XmlSchema();
                xmlSchema.SourceUri = _config.SchemaFileCustomer;

                XmlReaderSettings settings = new XmlReaderSettings();
                settings.Schemas.Add(xmlSchema);
                settings.ValidationType = ValidationType.Schema;

                _xmlReader = XmlReader.Create(_path, settings);
                _xmlDataDocument = new XmlDataDocument();
                _xmlDataDocument.Load(_xmlReader);

                ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler);

                _xmlDataDocument.Validate(eventHandler);
Avatar billede Slettet bruger
26. august 2008 - 12:18 #5
Hvis jeg smider dem ind i XMLSpy får jeg ingen fejl - så umiddelbart virker din XML og XSD...

/CS
Avatar billede halden Nybegynder
26. august 2008 - 13:09 #6
ja, det må være noget i min kode...
Avatar billede halden Nybegynder
26. august 2008 - 13:19 #7
Jeg fatter simpelthen ikke hvad der er galt...her er min class som validerer. En hver hjælp vil være værdisat.

public class DatahandlerCustomer
    {
        private string _path;
        private XmlDataDocument _xmlDataDocument;
        private XmlReader _xmlReader;
        private Configuration _config;

        public DatahandlerCustomer(string path)
        {
            _path = path;
            _config = new Configuration();

            ValiderXSD();
        }

        private void ValiderXSD()
        {
            try
            {
                XmlSchema xmlSchema = new XmlSchema();
                xmlSchema.SourceUri = _config.SchemaFileCustomer;

                XmlReaderSettings settings = new XmlReaderSettings();
                settings.Schemas.Add(xmlSchema);
                settings.ValidationType = ValidationType.Schema;
                settings.ValidationFlags = XmlSchemaValidationFlags.AllowXmlAttributes;

                _xmlReader = XmlReader.Create(_path, settings);
                _xmlDataDocument = new XmlDataDocument();
                _xmlDataDocument.Load(_xmlReader);

                ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler);

                _xmlDataDocument.Validate(eventHandler);


                _xmlReader.MoveToContent();  //Move the reader to the root node
            }
            catch (Exception ex)
            {
                throw new Exception(DateTime.Now.ToString() + " - Kunne ikke læse fil [" + _path + "] fejl: " + ex.Message);
            }
        }

        static void ValidationEventHandler(object sender, ValidationEventArgs e)
        {
            switch (e.Severity)
            {
                case XmlSeverityType.Error:
                    Notification.MessageBox("Error: " + e.Message);
                    //Console.WriteLine("Error: {0}", e.Message);
                    break;
                case XmlSeverityType.Warning:
                    Notification.MessageBox("Error: " + e.Message);
                    //Console.WriteLine("Warning {0}", e.Message);
                    break;
            }

        }

    }
Avatar billede halden Nybegynder
26. august 2008 - 13:20 #8
Avatar billede arne_v Ekspert
26. august 2008 - 15:19 #9
Din XML bruger jo ikke noget namespace mens dit XSD goer !
Avatar billede arne_v Ekspert
26. august 2008 - 15:20 #10
Din XML bruger jo ikke noget namespace mens dit XSD goer !
Avatar billede arne_v Ekspert
26. august 2008 - 15:35 #11
Sludder - den elementFormDefault giver faktisk ikke elementerne et namespace.
Avatar billede arne_v Ekspert
26. august 2008 - 15:47 #12
Det er vist et C#/.NET problem.

Valideringen virker for mig hvis jeg erstatter substansen i ValidateXSD med:

                XmlReaderSettings xrs = new XmlReaderSettings();
                xrs.ValidationType = ValidationType.Schema;
                xrs.Schemas.Add(XmlSchema.Read(new StreamReader(@"C:\z.xsd"), ValidationEventHandler));
                XmlReader xr = XmlReader.Create(@"C:\z.xml", xrs);
                XmlDataDocument doc = new XmlDataDocument();
                doc.Load(xr);
Avatar billede arne_v Ekspert
26. august 2008 - 15:55 #13
Men ivirkeligheden vil du jo nok bruge din ValidationEventHandler anderledes:

                XmlReaderSettings xrs = new XmlReaderSettings();
                xrs.ValidationType = ValidationType.Schema;
                xrs.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings;
                xrs.ValidationEventHandler += ValidationEventHandler;
Avatar billede halden Nybegynder
27. august 2008 - 09:33 #14
Hej Arne,
det virker perfekt. Så vidt jeg kan se er det kun rækkefølgen som er anderledes.
Men jeg siger tusind tak for hjælpen. Smid venligst svar.
Avatar billede arne_v Ekspert
27. august 2008 - 13:49 #15
kommer her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester