Voici ma première tentative de validation de XML avec XSD.Premiers pas avec la validation XSD avec .NET
Le fichier XML à valider:
<?xml version="1.0" encoding="utf-8" ?>
<config xmlns="Schemas" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="config.xsd">
<levelVariant>
<filePath>SampleVariant</filePath>
</levelVariant>
<levelVariant>
<filePath>LegendaryMode</filePath>
</levelVariant>
<levelVariant>
<filePath>AmazingMode</filePath>
</levelVariant>
</config>
Le XSD, situé dans "schemas/config.xsd" par rapport au fichier XML à valider:
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="config">
<xs:complexType>
<xs:sequence>
<xs:element name="levelVariant">
<xs:complexType>
<xs:sequence>
<xs:element name="filePath" type="xs:anyURI">
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
En ce moment, je je veux juste valider le fichier XML précisément tel qu'il apparaît actuellement. Une fois que je comprendrai mieux, je développerai plus. Ai-je vraiment besoin de tant de lignes pour quelque chose d'aussi simple que le fichier XML tel qu'il existe actuellement?
Le code de validation en C#:
public void SetURI(string uri)
{
XElement toValidate = XElement.Load(Path.Combine(PATH_TO_DATA_DIR, uri) + ".xml");
// begin confusion
// exception here
string schemaURI = toValidate.Attributes("xmlns").First().ToString()
+ toValidate.Attributes("xsi:noNamespaceSchemaLocation").First().ToString();
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add(null, schemaURI);
XDocument toValidateDoc = new XDocument(toValidate);
toValidateDoc.Validate(schemas, null);
// end confusion
root = toValidate;
}
Exécution du code ci-dessus donne cette exception:
The ':' character, hexadecimal value 0x3A, cannot be included in a name.
Toute illumination serait appréciée.
La première réponse a fonctionné pour moi, sauf qu'il manquait la gestion des erreurs ici: // L'analyse du fichier entraînera la validation. tandis que (lecteur.Lis()) ; Certaines erreurs (comme le début d'un élément XML mais rien d'autre) ne sont pas interceptées. Pire, ils ne provoquent même pas une exception dans le code appelant. –