Laden...

[Erledigt] XML-Schema-Validierung ignoriert key und keyref Definition

Erstellt von GG71 vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.278 Views
G
GG71 Themenstarter:in
75 Beiträge seit 2007
vor 11 Jahren
[Erledigt] XML-Schema-Validierung ignoriert key und keyref Definition

Hallo Leute,

bei der XML-Schema-Validierung verwende ich

ValidationFlags = XmlSchemaValidationFlags.ProcessSchemaLocation |
                  XmlSchemaValidationFlags.ProcessIdentityConstraints |
                  XmlSchemaValidationFlags.ReportValidationWarnings

erhalte aber keine Meldungen bei Verletzung der

<xs:key>

bzw.

<xs:keyref>

Definitionen.

Fehlt noch irgend eine Einstellung?
Gehen ggf. die xpath-Angaben der Selectoren in die Hose?
Wer von Euch benutzt so etwas öfters?

Ciao:
GG 😉

S
902 Beiträge seit 2007
vor 11 Jahren

Hallo,

wie validierst du? Auf einem XMLReader oder Document?
Vielleicht ist der Key in einem optionalen Element verschachtelt?

mfg
Serial

G
GG71 Themenstarter:in
75 Beiträge seit 2007
vor 11 Jahren

Hi,

über Reader:

        /// <summary>
        /// Deserialisierung -und- Schema-Validierung
        /// </summary>
        /// <param name="xml">XML Daten</param>
        /// <param name="validationMsgs">Meldungen der Schema-Validierung</param>
        /// <returns>RessourceExportTyp object</returns>
        public static RessourceExportTyp Deserialize(string xml, out List<string> validationMsgs)
        {
            RessourceExportTyp result = null;
            List<string>         msgs = null;
            XmlReaderSettings   xrs4v = null;

            Action<object, ValidationEventArgs> validationEventHandler = (o, e) =>
                msgs.Add(String.Format(Properties.Resources.MsgFormatXmlSchemaValidation, o, e.Message));

            using (StringReader stringReaderXml = new System.IO.StringReader(xml))
            {
                validationMsgs = new List<string>();
                xrs4v = validationEventHandler.GetXmlReaderSettings(XmlSchemaValidationFlags.ReportValidationWarnings |
                                                                    XmlSchemaValidationFlags.ProcessSchemaLocation |
                                                                    XmlSchemaValidationFlags.ProcessIdentityConstraints,
                                                                    Properties.Resources.XsdRessourcen,
                                                                    Properties.Resources.XsdReiseDaten);

                using (XmlReader xr = XmlReader.Create(stringReaderXml, xrs4v))
                {
                    result = Serializer.Deserialize(xr) as RessourceExportTyp;
                    xr.Close();
                }

                if ((null != msgs) && (msgs.Any()))
                {
                    // XML-Validierung fehlgeschlagen.
                    msgs.Insert(0, Properties.Resources.ErrMsgXmlSchemaValidation);
                    validationMsgs = msgs;
                    throw new XmlSchemaValidationException(Properties.Resources.ErrMsgXmlSchemaValidation);
                }

                return result;
            }
        }

Key in einem optionalen Element? Was genau meinst Du damit?
Anbei ein Schema-Übersicht. Bei dem XPath-Angaben bin ich mir nicht sicher, wüsste aber kein Weg um sie zu prüfen:
(s. Anhang)

Ciao:
GG 😉

G
GG71 Themenstarter:in
75 Beiträge seit 2007
vor 11 Jahren

Anbei ein Schema-Übersicht. Bei dem XPath-Angaben bin ich mir nicht sicher

Und genau die waren auch falsch. Richtig ist:

<!-- root Element Def -->
<xs:element name="RessourcenExport" type="RessourcenExportTyp">
    <xs:key name="PkRessourceKategorien">
        <xs:selector xpath="./mstns:Kategorien/mstns:Kategorie" />
        <xs:field xpath="@Id" />
    </xs:key>
    <xs:key name="PkRessourcen">
        <xs:selector xpath="./mstns:Ressourcen/mstns:Ressource" />
        <xs:field xpath="@Id" />
    </xs:key>
    <xs:keyref name="FkRessourcenToRessourceKategorie" refer="mstns:PkRessourceKategorien">
        <xs:selector xpath="./mstns:Ressourcen/mstns:Ressource/mstns:Inhalt" />
        <xs:field xpath="@Kategorie" />
    </xs:keyref>
</xs:element>

Die Elemente müssen vollqualifiziert (hier: mstns) angegeben werden, dann klappt 's ja auch 😉

TrackBack: http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.xml/2004-05/0334.html

Ciao:
GG 😉