7
votes

Schéma d'analyse en Java avec les importations et comprend?

Je tente d'analyser de charger un schéma XML plutôt compliqué dans un objet de schéma dans Java afin que je puisse faire une certaine validation sur des messages XML.

Mon code semble similaire à celui-ci: P>

<?xml version="1.0" encoding="UTF-8"?>
  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="base_1">
  <xs:import namespace="base_1" schemaLocation="common/MessageBase.xsd"/>
</xs:schema>


0 commentaires

3 Réponses :


9
votes

Je pense que l'utilisation de StreamSource, sans spécifier la base de la base, est la source de votre problème.

L'analyseur n'a aucun moyen de savoir où se trouve le schéma principal, il ne peut donc pas résoudre le commun / MessageBase.xml.

Utilisez le constructeur à deux arguments et transmettez-vous dans un système de chemin qui vous tient à partir de.

Voir le Javadoc pour StreamSource.


7 commentaires

Essayé cela et obtenez toujours l'erreur suivante: SRC-RESOLVE: Impossible de résoudre le nom 'Base: StatusWithIserror_Optional' à un (N) Composant "Attribut Group".


C'est un problème différent. Il suggère que votre schéma n'est pas complet et autonome. Avez-vous un groupe d'attributs nommé Statuswitherror_Optional? Est-ce dans la bonne espace de noms?


Oui, il est défini dans un fichier séparé au même niveau que le fichier de schéma de base. Même espace de noms. Si le système SystemID soit le chemin du fichier root .xsd ou au répertoire racine du schéma? Que diriez-vous de l'autre argument du constructeur 2-ARC?


L'ID système doit être le chemin de l'ensemble du schéma. Encore une fois, l'erreur que vous obtenez indique que la recherche du schéma importé fonctionne, mais il y a maintenant un problème réel avec le contenu du schéma. Le premier arg n'est que le flux ou le lecteur, après tout.


Existe-t-il un moyen d'obtenir plus d'informations sur la manière dont le schéma est analysé? De quel ordre les fichiers sont chargés, où dans le fichier, il s'exécute dans ces erreurs, etc.? (Merci de votre aide, en passant)


Vous devez tout lire dans un éditeur de texte et fouiller. Vous pouvez également essayer de le lire avec Apache Xmlschema, cela pourrait ou non plus informatif.


@bmargulies: Après avoir passé 4h pour savoir que c'est la raison pour laquelle les tags inclus dans mon XML-Schema ne résolvent pas, je vous donnerais volontiers +10 pour cette réponse :) En plus de vos informations: En fait, le StreamSource (Fichier) Constructeur définit le Systemid lui-même en interrogeant l'URL du fichier. Le problème ici semble qu'il ait passé un chemin relatif. J'ai rencontré le même problème parce que j'ai utilisé StreamSource (InputStream) qui ne fournit bien sûr aucune information sur le chemin - à moins que vous ne le définissiez explicitement. Pour une référence future pour moi-même et d'autres: D



2
votes

Afin de résoudre les Xsds importés, vous devez associer l'usine Schema avec une résolution de ressources: xxx

Pour plus de détails, vous pouvez regarder ce answer .


0 commentaires

11
votes

Il n'y a pas besoin d'une résolution de ressources si vous utilisez une URL au lieu d'un fluxource.

URL schemaURL = Thread.currentThread().getContextClassLoader().getResource(schemaFileName);
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(schemaURL);


1 commentaires

Je l'ai déjà fait utiliser une URL, mais je n'ai toujours pas résolu les ressources correctement pour moi quand elle devait faire face aux importations. J'ai utilisé un ResourceSolver et c'était corrigé cependant. Pourquoi cela fonctionne-t-il pour vous et non pour moi reste la question. Peut-être que cela a à voir avec la structure du projet. Les chemins de mes fichiers XSD sont relatifs à mon Java ClassPath, mon meilleur devin, est que le vôtre peut être relatif à votre dossier de travail.