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 😉
Hallo,
wie validierst du? Auf einem XMLReader oder Document?
Vielleicht ist der Key in einem optionalen Element verschachtelt?
mfg
Serial
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 😉
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 😉