L'analyse de Schéma XSD avec XSOM en Java. Comment accéder à l'élément et les types complexes
Je vais avoir beaucoup de difficuly de l'analyse d'une .Fichier XSD avec un XSOM en Java. J'en ai deux .Les fichiers XSD on définit un calendrier et la deuxième mondiale types. Je voudrais être en mesure de lire le fichier de calendrier et de déterminer que:
calendrier a 3 propriétés
- Valide est un ENUM appelé ein
- Cal est une Chaîne
- Statut est un ENUM appelé eSTATUS
Calendrier.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:gtypes="http://www.btec.com/gtypes"
elementFormDefault="qualified">
<xs:import namespace="http://www.btec.com/gtypes"
schemaLocation="gtypes.xsd"/>
<xs:element name="CALENDAR">
<xs:complexType>
<xs:sequence>
<xs:element name="Valid" type="eYN" minOccurs="0"/>
<xs:element name="Cal" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="gtypes:STRING">
<xs:attribute name="IsKey" type="xs:string" fixed="Y"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="Status" type="eSTATUS" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="eSTATUS">
<xs:simpleContent>
<xs:extension base="gtypes:ENUM"/>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="eYN">
<xs:simpleContent>
<xs:extension base="gtypes:ENUM"/>
</xs:simpleContent>
</xs:complexType>
gtypes.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.btec.com/gtypes"
elementFormDefault="qualified">
<xs:complexType name="ENUM">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="TYPE" fixed="ENUM"/>
<xs:attribute name="derived" use="optional"/>
<xs:attribute name="readonly" use="optional"/>
<xs:attribute name="required" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="STRING">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="TYPE" use="optional"/>
<xs:attribute name="derived" use="optional"/>
<xs:attribute name="readonly" use="optional"/>
<xs:attribute name="required" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:schema>
Le code de ma tentative d'accéder à cette information est ci-dessous. Je suis assez nouveau à Java, de sorte
tout le style de la critique de bienvenue.
J'ai vraiment besoin de savoir
- Comment j'ai accès au complexe de type cal et de voir que c'est une chaîne de caractères?
- Comment puis-je accéder à la définition du Statut à voir, c'est une énumération de type eSTATUS
souligné texte
J'ai a plusieurs tentatives pour accéder à l'information via ComplexType et le Contenu et les Éléments. Cependant, je suis juste ne pas l'obtenir et je ne trouve pas d'exemples de l'aide. - Je m'attendre (espérer) la meilleure méthode est (relativement) simple quand vous savez comment. Donc, encore une fois, si quelqu'un pouvait me diriger dans la bonne direction, ce qui serait d'une grande aide.
xmlfile = "Calendar.xsd"
XSOMParser parser = new XSOMParser();
parser.parse(new File(xmlfile));
XSSchemaSet sset = parser.getResult();
XSSchema s = sset.getSchema(1);
if (s.getTargetNamespace().equals("")) //this is the ns with all the stuff
//in
{
//try ElementDecls
Iterator jtr = s.iterateElementDecls();
while (jtr.hasNext())
{
XSElementDecl e = (XSElementDecl) jtr.next();
System.out.print("got ElementDecls " + e.getName());
//ok we've got a CALENDAR.. what next?
//not this anyway
/*
*
* XSParticle[] particles = e.asElementDecl() for (final XSParticle p :
* particles) { final XSTerm pterm = p.getTerm(); if
* (pterm.isElementDecl()) { final XSElementDecl ed =
* pterm.asElementDecl(); System.out.println(ed.getName()); }
*/
}
//try all Complex Types in schema
Iterator<XSComplexType> ctiter = s.iterateComplexTypes();
while (ctiter.hasNext())
{
//this will be a eSTATUS. Lets type and get the extension to
//see its a ENUM
XSComplexType ct = (XSComplexType) ctiter.next();
String typeName = ct.getName();
System.out.println(typeName + newline);
//as Content
XSContentType content = ct.getContentType();
//now what?
//as Partacle?
XSParticle p2 = content.asParticle();
if (null != p2)
{
System.out.print("We got partical thing !" + newline);
//might would be good if we got here but we never do :-(
}
//try complex type Element Decs
List<XSElementDecl> el = ct.getElementDecls();
for (XSElementDecl ed : el)
{
System.out.print("We got ElementDecl !" + ed.getName() + newline);
//would be good if we got here but we never do :-(
}
Collection<? extends XSAttributeUse> c = ct.getAttributeUses();
Iterator<? extends XSAttributeUse> i = c.iterator();
while (i.hasNext())
{
XSAttributeDecl attributeDecl = i.next().getDecl();
System.out.println("type: " + attributeDecl.getType());
System.out.println("name:" + attributeDecl.getName());
}
}
}
OriginalL'auteur DUFF | 2011-10-30
Vous devez vous connecter pour publier un commentaire.
Bien après beaucoup de recherches sur google je pense que j'ai répondu à ma propre question. Ma solution proposée était désespérément large de la marque.
Le principal problème était que le XSD dispose de trois espaces de noms et j'ai été à la recherche dans le mauvais pour la mauvaise chose.
Si vous êtes à la recherche pour analyser un XSD dans XSOM assurez-vous de comprendre la structure du fichier XSD et ce que veulent dire les tags avant de commencer - il vous fera économiser beaucoup de temps.
Je vais poster ma version ci-dessous que je suis sûr qu'il peut être amélioré!
Quelques liens qui ont été utiles:
http://msdn.microsoft.com/en-us/library/ms187822.aspx
http://it.toolbox.com/blogs/enterprise-web-solutions/parsing-an-xsd-schema-in-java-32565
http://www.w3schools.com/schema/el_simpleContent.asp
La sortie de ce est:
OriginalL'auteur DUFF